kzen.dev
  • Вопросы
  • Метки
  • Пользователи
Оповещения
Вознаграждения
Регистрация
После регистрации, сможете получать уведомления об ответах и комментариях на Ваши вопросы.
Вход
Если у Вас уже есть аккаунт, войдите чтобы проверить новые уведомления.
Тут будут вознаграждения за добавленные вопросы, ответы и комментарий.
Дополнительно
Источник
Редактировать
Анонимный пользователь
Вопрос

Bash записывает в файл без echo?

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

echo "Hello world" > test.txt

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

> test.txt <<<"Hello world"

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

39 2012-07-01T03:27:33+00:00 8
Программирование
command-line
bash
io-redirection
 Eric
Eric
5-го марта 2013 в 4:49
2013-03-05T16:49:12+00:00
Дополнительно
Источник
Редактировать
#16573860

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

cat <<EOF > test.txt
some text
EOF

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

echo "$password" > test.txt
56
0
 guest
guest
9-го августа 2013 в 12:40
2013-08-09T12:40:38+00:00
Дополнительно
Источник
Редактировать
#16573861

У меня была проблема, что не можешь отправить " и>" и в итоге с Эхо!

echo "Hello world" | dd of=test.txt
16
0
 ormaaj
ormaaj
1-го июля 2012 в 4:01
2012-07-01T04:01:38+00:00
Дополнительно
Источник
Редактировать
#16573857

Существует слишком много способов, чтобы обсуждать то, что вас, вероятно, не волнует. Можно, конечно, взломать - 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
 ormaaj
ormaaj
Редактировал ответ 1-го июля 2012 в 4:20
3
0
 perickso
perickso
22-го сентября 2012 в 2:29
2012-09-22T02:29:36+00:00
Дополнительно
Источник
Редактировать
#16573858

В bash это можно сделать следующим образом

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

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

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

 eckes
eckes
Редактировал ответ 22-го сентября 2012 в 8:42
3
0
David Burke
David Burke
5-го декабря 2012 в 5:48
2012-12-05T05:48:31+00:00
Дополнительно
Источник
Редактировать
#16573859
awk ' BEGIN { print "Hello, world" } ' > test.txt

сделал бы это

Mayur Birari
Mayur Birari
Редактировал ответ 5-го декабря 2012 в 6:04
3
0
Ignacio Vazquez-Abrams
Ignacio Vazquez-Abrams
1-го июля 2012 в 3:36
2012-07-01T03:36:45+00:00
Дополнительно
Источник
Редактировать
#16573856

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

2
0
Ivan Gut
Ivan Gut
31-го января 2017 в 4:03
2017-01-31T04:03:33+00:00
Дополнительно
Источник
Редактировать
#16573862

Я'вэ решение для bash пуристов. <п>функция 'определение' помогает нам назначить многострочное значение переменной. Это один позиционный параметр: имя переменной присвоить значение.</п> <п>в помощи heredoc, при необходимости там'параметр повторного расширения тоже!</п>

!/бин/Баш

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" 

Пусть Вам ПОВЕЗЕТ!

 codeforester
codeforester
Редактировал ответ 31-го января 2017 в 5:41
1
0
 sdkks
sdkks
21-го июля 2017 в 2:41
2017-07-21T14:41:11+00:00
Дополнительно
Источник
Редактировать
#16573863

Есть несколько способов сделать это, позвольте's запускает этот скрипт называется exercise.sh

#!/usr/bin/env bash

> file1.txt cat <<< "This is a here-string with random value $RANDOM"

# Or if you prefer to see what is happening and write to file as well
tee file2.txt <<< "Here is another here-string I can see and write to file"

# if you want to work multiline easily
cat <<EOF > file3.txt
You don't need to escape any quotes here, $ marks start of variables, unless escaped.
This is random value from variable $RANDOM
This is literal \$RANDOM
EOF

# Let's say you have a variable with multiline text and you want to manipulate it
a="
1
2
3
33
"

# Assume I want to have lines containing "3". Instead of grep it can even be another script
a=$(echo "$a" | grep 3)

# Then you want to write this to a file, although here-string is fine,
# if you don't need single-liner command, prefer heredoc
# Herestring. (If it's single liner, variable needs to be quoted to preserve newlines)
> file4.txt cat <<< "$a"
# Heredoc
cat <<EOF > file5.txt
$a
EOF

Это вывод, который вы должны увидеть:

$ bash exercise.sh
Here is another here-string I can see and write to file

И файлы должны содержать данные:

$ ls
exercise.sh  file1.txt  file2.txt  file3.txt  file4.txt  file5.txt
$ cat file1.txt
This is a here-string with random value 20914
$ cat file2.txt
Here is another here-string I can see and write to file
$ cat file3.txt
You don't need to escape any quotes here, $ marks start of variables, unless escaped.
This is random value from variable 15899
This is literal $RANDOM
$ cat file4.txt
3
33
$ cat file5.txt
3
33
 sdkks
sdkks
Редактировал ответ 28-го августа 2018 в 3:31
1
0
Похожие сообщества 1
pro.bash
pro.bash
511 пользователей
All about Nix shells, signals, processes and development in general.
Открыть telegram
Добавить вопрос
Категории
Все
Технологий
Культура / Отдых
Жизнь / Искусство
Наука
Профессии
Бизнес
Пользователи
Все
Новые
Популярные
1
Ilya Smirnov
Зарегистрирован 6 дней назад
2
Денис Васьков
Зарегистрирован 1 неделю назад
3
Dima Patrushev
Зарегистрирован 1 неделю назад
4
sirojidddin otaboyev
Зарегистрирован 2 недели назад
5
Елена Гайдамамакинат
Зарегистрирован 2 недели назад
ID
JA
KO
RU
© kzen.dev 2023
Источник
stackoverflow.com
под лицензией cc by-sa 3.0 с атрибуцией