Подтвердить что ты не робот

Bash записать в файл без эха?

Как упражнение, существует ли способ перенаправления строки в файл без эха? В настоящее время я использую

echo "Hello world" > test.txt

Я знаю о cat и printf. Я думал что-то вроде

> test.txt <<<"Hello world"

Конечно, это не работает, но может быть, подобная команда?

4b9b3361

Ответ 1

Вы можете сделать это с помощью "cat" и здесь-документа.

cat <<EOF > test.txt
some text
EOF

Одной из причин этого было бы избежать любой возможности того, что пароль будет отображаться на выходе ps. Однако в bash и большинстве современных оболочек "эхо" - это встроенная команда, и она не будет отображаться в выводах ps, поэтому использование чего-то вроде этого безопасно (игнорируя любые проблемы с сохранением паролей в файлах, конечно ):

echo "$password" > test.txt

Ответ 2

У меня возникла проблема не в состоянии отправить " > " и закончилась эхом!

echo "Hello world" | dd of=test.txt

Ответ 3

Есть слишком много способов обсудить, что вам, вероятно, все равно. Вы можете взломать конечно - strace bash, или сделать все виды черной магии, выполняющейся Bash в gdb.

У вас на самом деле есть два совершенно разных примера. <<<'string' уже записывает строку в файл. Если что-то приемлемо, кроме printf, echo и cat, вы можете использовать многие другие команды, чтобы вести себя как cat (sed, awk, tee и т.д.).

$ cp /dev/stdin ./tmpfooblah <<<'hello world'; cat tmpfooblah
hello world

Или ад, в зависимости от того, как вы скомпилировали Bash.

$ enable -f /usr/lib/bash/print print; print 'hello world' >tmpfile

Если вы хотите использовать только строки Bash и перенаправление, в чистом bash, без взлома и без загрузки, это невозможно. Однако в ksh93 это возможно.

 $ rm tmpfooblah; <<<'hello world' >tmpfooblah <##@(&!()); cat tmpfooblah
 hello world

Ответ 4

Способ сделать это в bash:

zsh <<< '> test <<< "Hello World!"'

Это одно из интересных различий между zsh и bash: с учетом unchained > или >>, zsh имеет смысл подключить его к stdin, а bash - нет. Это было бы совершенно полезно - если бы оно было стандартным. Я попытался использовать это для отправки и добавления моего ssh-ключа поверх ssh в удаленный файл authorized_keys, но удаленный хост был bash, конечно, и спокойно ничего не делал.

И поэтому вы должны просто использовать cat.

Ответ 5

Только перенаправление не будет работать, так как нет ничего, чтобы подключить открытые файловые дескрипторы. Нет, нет такого способа.

Ответ 6

awk ' BEGIN { print "Hello, world" } ' > test.txt

сделал бы это

Ответ 7

У меня есть решение для пуристов bash.

Функция 'define' помогает нам назначить многострочное значение переменной. Это занимает один позиционный параметр: имя переменной для назначения значения.

В heredoc, возможно, есть также расширения параметров!

#!/bin/bash

define ()
{
  IFS=$'\n' read -r -d '' $1
}

BUCH="Matthäus 1"

define TEXT<<EOT
Aus dem Buch: ${BUCH}

1 Buch des Geschlechts Jesu Christi, des Sohnes Davids, des Sohnes Abrahams.
2 Abraham zeugte Isaak; Isaak aber zeugte Jakob, Jakob aber zeugte Juda und seine Brüder;
3 Juda aber zeugte Phares und Zara von der Thamar; Phares aber zeugte Esrom, Esrom aber zeugte Aram,

4 Aram aber zeugte Aminadab, Aminadab aber zeugte Nahasson, Nahasson aber zeugte Salmon,
5 Salmon aber zeugte Boas von der Rahab; Boas aber zeugte Obed von der Ruth; Obed aber zeugte Isai,
6 Isai aber zeugte David, den König. David aber zeugte Salomon von der, die Urias Weib gewesen; 

EOT

define TEXTNOEXPAND<<"EOT" # or define TEXTNOEXPAND<<'EOT'
Aus dem Buch: ${BUCH}

1 Buch des Geschlechts Jesu Christi, des Sohnes Davids, des Sohnes Abrahams.
2 Abraham zeugte Isaak; Isaak aber zeugte Jakob, Jakob aber zeugte Juda und seine Brüder;
3 Juda aber zeugte Phares und Zara von der Thamar; Phares aber zeugte Esrom, Esrom aber zeugte Aram,


4 Aram aber zeugte Aminadab, Aminadab aber zeugte Nahasson, Nahasson aber zeugte Salmon,
5 Salmon aber zeugte Boas von der Rahab; Boas aber zeugte Obed von der Ruth; Obed aber zeugte Isai,
6 Isai aber zeugte David, den König. David aber zeugte Salomon von der, die Urias Weib gewesen; 

EOT

OUTFILE="/tmp/matthäus_eins"

# Create file
>"$OUTFILE"

# Write contents
{
   printf "%s\n" "$TEXT"
   printf "%s\n" "$TEXTNOEXPAND"
} >>"$OUTFILE" 

Будь повезло!

Ответ 8

На самом деле вы почти там

cat > fileToWrite.txt <<< "this is my here-string"

Я использую это с переменными, содержащими в себе тонны строк. (т.е. сначала обработать все в памяти, а затем окончательно записать в файл)

a=$(do some operation here, get my variable loaded with multi-line test)

поэтому echo "$a" создаст:

line1
line2
.
.
.
lineN

Затем скажите, что я хочу сделать другую операцию синтаксического анализа здесь, а затем записать в файл.

a=$($a | ./someOtherScript)

Наконец, напишите в файл.

cat > file.txt <<< $a

Пример выглядит немного глупо, и все это можно сделать в одной строке, я согласен. Это немного упрощено для демонстрации. Здесь могут быть весьма удобными перекрестные ссылки.