Bash записать в файл без эха?
Как упражнение, существует ли способ перенаправления строки в файл без эха? В настоящее время я использую
echo "Hello world" > test.txt
Я знаю о cat
и printf
. Я думал что-то вроде
> test.txt <<<"Hello world"
Конечно, это не работает, но может быть, подобная команда?
Ответы
Ответ 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
Пример выглядит немного глупо, и все это можно сделать в одной строке, я согласен. Это немного упрощено для демонстрации. Здесь могут быть весьма удобными перекрестные ссылки.