echo & ldquo; hello & rdquo; & amp; 0 | & GT; file.txt не записывает файл file.txt

if [ "$VAR1"| cut -c 7-18 = "GHIJKLMN.csv" ]; then

Что это значит, это выполнить [ "$VAR1" и передать вывод на cut -c 7-18 = "GHIJKLMN.csv" ]. [ потерпит неудачу, потому что для его последнего аргумента требуется ], а cut потерпит неудачу, потому что, вероятно, ни =, ни ] не являются файлами.

Я собираюсь угадать, что вы хотели:

if [ "$(echo "$VAR1" | cut -c 7-18)" = "GHIJKLMN.csv" ]; then

Обратите внимание, как я завершаю команду в "$()". Это заставляет его выполнять и заменять свое место выходом. Цитаты важны, поэтому вывод не разбивается на несколько аргументов для [.

Следуя тому, что я считаю лучшим методом для bash, я бы рекомендовал сделать это вместо:

Это позволяет избежать специальной интерпретации $VAR1 эхом (в зависимости от содержимого, может быть ошибкой для опций) и вызова 2 ненужных исполняемых файлов, [ и echo. Что-то особенное, чтобы отметить здесь, что вам действительно не нужны никакие цитаты, которые я использовал. [[ является специальным синтаксисом bash, и даже если подстановка имела пробелы, bash не разбивал бы на слово. Это также не раскололо бы то, что было дано <<<. GHIJKLMN.csv не имеет пробелов или специальных символов, так что это тоже будет хорошо.

Вы также можете пропустить вызов cut, выполнив следующее:

if [[ "${VAR1:6:12}" = "GHIJKLMN.csv" ]]; then

Теперь все выполненный в bash без выполнения какой-либо другой программы. В этом синтаксисе вместо того, чтобы указывать диапазон символов, который вы хотите, как и на cut, вы предоставляете смещение 0 на первый символ и количество символов, которое вы хотите. Это 7 - 1, потому что индексы cut начинаются с 1 и 12, потому что диапазон 7-18 включен, поэтому 18 - 7 + 1.

Я только что увидел, ваш $VAR1 равен [ F25]. Поскольку вы сократили до конца, вам не нужно указывать счет:

if [[ "${VAR1:6}" = "GHIJKLMN.csv" ]]; then
5
задан 29 March 2018 в 02:19

12 ответов

В bash пустая команда с перенаправлением просто открывает файл способом, связанным с перенаправлением, а затем закрывает его *. echo "hello" >&0 | > file.txt представляет собой составную команду, состоящую из двух простых команд: echo "hello" >&0, > file.txt, pipeed. Вторая команда пуста, поэтому bash просто открывает файл для записи, обрезает его и закрывает.

В терминале обычно подключаются стандартный вывод, вывод и ошибка. Поэтому, когда вы перенаправляете stdout на stdin, он все еще указывает на терминал, а вывод echo hello >&0 отображается в терминале и вообще не отправляется в канал.

В zsh пустая команда с перенаправлением по умолчанию имеет cat команду. Таким образом, echo "hello" >&0 | > file.txt эффективно echo "hello" >&0 | cat > file.txt, и вы увидите эффект, который вы хотите. Это невозможно в bash. Здесь вы увидите другую функцию перенаправления, которая не видна в bash: когда вы перенаправляете вывод команды несколько раз, вывод отправляется каждому из перенаправленных адресатов (поэтому hello отправляется как на терминал, так и на труба). В bash он отправляется только в последнее перенаправленное местоположение.

* Исключение составляет пустая команда с перенаправлением с перенаправленным stdin. В $(<some-file) bash будет читать содержимое some-file и использовать его как значение подстановки команды.

15
ответ дан 22 May 2018 в 11:44
  • 1
    и в echo "hello" >&0 | cat > file.txt в Bash, это перенаправление >&0, которое обрабатывается последним, поэтому вывод идет на терминал (и только там) – ilkkachu 28 March 2018 в 22:38

В bash пустая команда с перенаправлением просто открывает файл способом, связанным с перенаправлением, а затем закрывает его *. echo "hello" >&0 | > file.txt представляет собой составную команду, состоящую из двух простых команд: echo "hello" >&0, > file.txt, pipeed. Вторая команда пуста, поэтому bash просто открывает файл для записи, обрезает его и закрывает.

В терминале обычно подключаются стандартный вывод, вывод и ошибка. Поэтому, когда вы перенаправляете stdout на stdin, он все еще указывает на терминал, а вывод echo hello >&0 отображается в терминале и вообще не отправляется в канал.

В zsh пустая команда с перенаправлением по умолчанию имеет cat команду. Таким образом, echo "hello" >&0 | > file.txt эффективно echo "hello" >&0 | cat > file.txt, и вы увидите эффект, который вы хотите. Это невозможно в bash. Здесь вы увидите другую функцию перенаправления, которая не видна в bash: когда вы перенаправляете вывод команды несколько раз, вывод отправляется каждому из перенаправленных адресатов (поэтому hello отправляется как на терминал, так и на труба). В bash он отправляется только в последнее перенаправленное местоположение.

* Исключение составляет пустая команда с перенаправлением с перенаправленным stdin. В $(<some-file) bash будет читать содержимое some-file и использовать его как значение подстановки команды.

15
ответ дан 17 July 2018 в 17:56

В bash пустая команда с перенаправлением просто открывает файл способом, связанным с перенаправлением, а затем закрывает его *. echo "hello" >&0 | > file.txt представляет собой составную команду, состоящую из двух простых команд: echo "hello" >&0, > file.txt, pipeed. Вторая команда пуста, поэтому bash просто открывает файл для записи, обрезает его и закрывает.

В терминале обычно подключаются стандартный вывод, вывод и ошибка. Поэтому, когда вы перенаправляете stdout на stdin, он все еще указывает на терминал, а вывод echo hello >&0 отображается в терминале и вообще не отправляется в канал.

В zsh пустая команда с перенаправлением по умолчанию имеет cat команду. Таким образом, echo "hello" >&0 | > file.txt эффективно echo "hello" >&0 | cat > file.txt, и вы увидите эффект, который вы хотите. Это невозможно в bash. Здесь вы увидите другую функцию перенаправления, которая не видна в bash: когда вы перенаправляете вывод команды несколько раз, вывод отправляется каждому из перенаправленных адресатов (поэтому hello отправляется как на терминал, так и на труба). В bash он отправляется только в последнее перенаправленное местоположение.

* Исключение составляет пустая команда с перенаправлением с перенаправленным stdin. В $(<some-file) bash будет читать содержимое some-file и использовать его как значение подстановки команды.

15
ответ дан 23 July 2018 в 18:48

А я понимаю, о чем вы думали (я думаю). Вы пытались

echo hello | > file

, и ничего не случилось с file, поэтому вы подумали, может быть, мне нужно вывести вывод моей команды в stdin путем перенаправления:

echo hello >&0 

Но поворот stdout в stdin - это именно то, что делает труба. Он принимает stdout и передает его команде справа от stdin. Если вы перенаправляете stdout, ничто не пройдет через трубу:

$ echo hello >&0 | cat > file
hello
$ cat file
$

(ничего там)

Но hello вышел в терминал, который читается с stdin, как обычно :

$ cat /dev/fd/0
hi
hi
I am talking to myself!
I am talking to myself!

и т. д. ...

Если мы не перенаправляем ...

$ echo hello | cat > file
$ cat file
hello

stdout of echo hello прошел (вместо терминала) и стал stdin cat.

Итак, труба делает то, что вы хотели сделать (поверните stdout в stdin и подключите его к правой команде), и вы

Что касается того, почему пустая команда с перенаправлением не делает то, что вы хотите, см. ответ muru.

12
ответ дан 22 May 2018 в 11:44

Я предполагаю, что вы хотите записать вывод в файл и stdout.

echo hello > file.txt 

делает это частично, но пропускает стандартный вывод (ничего не выводит на консоль). Если вы тоже этого хотите, используйте команду tee, как показано ниже:

echo hello | tee file.txt

Он выводит вывод echo на вход tee, а затем записывает тэ на экран и в file.txt.

Если вы просто хотите напечатать файл, используйте команду cat, как показано ниже:

echo hello | cat >file.txt

Также проверьте этот ответ, как работают перенаправления: https: //stackoverflow.com/a/818265/5771279

и это для того, как работает труба: https://stackoverflow.com/a/818265/5771279

8] Посмотрите также на man-страницу команды tee.

5
ответ дан 22 May 2018 в 11:44
  • 1
    Я просто хочу записать файл. Почему эта команда ничего не делает: echo hello | & GT; file.txt – Prof-Wiz 28 March 2018 в 15:14
  • 2
    он делает :), записывает вывод в файл. В этом конкретном примере он просто очищает файл и ничего не пишет. Поскольку команда после того, как труба ничего не выводит (нет команды) – Levente M 28 March 2018 в 15:20
  • 3
    Это было хорошо прочитано. Не понимаю, почему «эхо-тест & gt; & amp; 0» по-прежнему печатает «тест». Выход эха будет stdin, поэтому ничего не должно выводиться – Prof-Wiz 28 March 2018 в 15:47
  • 4
    @ Prof-Wiz " вывод эхо-сигнала будет stdin, поэтому ничто не должно выводить " но в качестве ответа muru , stdin подключен к вашему терминалу (в режиме чтения / записи), поэтому все, что написано на stdin, все еще видно. В отличие от echo hello < /dev/null >&0 (где stdin берется из «нулевого устройства», но любой файл будет делать) вызывает ошибку, потому что stdin был открыт только для чтения и не может быть записан в. – TripeHound 28 March 2018 в 17:43
Символ > предназначен для перенаправления файлов для запуска файла. Символ >> предназначен для перенаправления файлов в конец файла (добавление). Символ | предназначен для «трубопровода» или передачи вывода из одной команды в качестве входа в другую команду.
$ echo "Hello" > file.txt
$ echo "World!" >> file.txt
$ cat file.txt
Hello
World!
$ cat file.txt | grep !
World!

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

&>0 согласно Руководство для сценариев Advanced-Bash:

&>filename
  # Redirect both stdout and stderr to file "filename."
  # This operator is now functional, as of Bash 4, final release.

В вашем случае имя файла было 0, которое является стандартным вводом. Таким образом, он перенаправляет все выходные данные на вход. Который, насколько я могу судить, это круговая ссылка, которая не сработает. Используемый вами синтаксис - это >&0, который перенаправляет вывод на вход.

«filenames»:

Символ > предназначен для перенаправления файлов для запуска файла. 1] 1 стандартный вывод Символ >> предназначен для перенаправления файлов в конец файла (добавление).

Традиционный способ использования файлового дескриптора 0 (стандартный ввод) через перенаправление файлов:

 0< FILENAME
    < FILENAME
      # Accept input from a file.
      # Companion command to ">", and often used in combination with it.
      #
      # grep search-word <filename

Если вы хотите использовать команду echo и | вместе (как указывает ответ Занны) вы можете использовать:

$ echo "hello" | cat > file.txt
$ cat file.txt
hello
0
ответ дан 22 May 2018 в 11:44
  • 1
    Вы можете также обратиться к >&0 – Sergiy Kolodyazhnyy 29 March 2018 в 04:12
  • 2
    @SergiyKolodyazhnyy Я старался изо всех сил, но не думаю, что это так здорово. 2>&1 всегда была моей ахиллесовой пятой. Это действительно ваша чашка чая, и вам будет приятно читать ваш ответ. – WinEunuuchs2Unix 29 March 2018 в 05:19

Я предполагаю, что вы хотите записать вывод в файл и stdout.

echo hello > file.txt

делает это частично, но пропускает стандартный вывод (ничего не выводит на консоль). Если вы тоже этого хотите, используйте команду tee, как показано ниже:

echo hello | tee file.txt

Он выводит вывод echo на вход tee, а затем записывает тэ на экран и в file.txt.

Если вы просто хотите напечатать файл, используйте команду cat, как показано ниже:

echo hello | cat >file.txt

Также проверьте этот ответ, как работают перенаправления: https: //stackoverflow.com/a/818265/5771279

и это для того, как работает труба: https://stackoverflow.com/a/818265/5771279

Посмотрите также на man-страницу команды tee.

5
ответ дан 17 July 2018 в 17:56
Символ > предназначен для перенаправления файлов для запуска файла. Символ >> предназначен для перенаправления файлов в конец файла (добавление). Символ | предназначен для «трубопровода» или передачи вывода из одной команды в качестве входа в другую команду. $ echo "Hello" > file.txt $ echo "World!" >> file.txt $ cat file.txt Hello World! $ cat file.txt | grep ! World!

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

&>0 согласно Руководство для сценариев Advanced-Bash:

&>filename # Redirect both stdout and stderr to file "filename." # This operator is now functional, as of Bash 4, final release.

В вашем случае имя файла было 0, которое является стандартным вводом. Таким образом, он перенаправляет все выходные данные на вход. Который, насколько я могу судить, это круговая ссылка, которая не сработает. Используемый вами синтаксис - это >&0, который перенаправляет вывод на вход.

«filenames»:

Символ > предназначен для перенаправления файлов для запуска файла. 1 стандартный вывод Символ >> предназначен для перенаправления файлов в конец файла (добавление).

Традиционный способ использования файлового дескриптора 0 (стандартный ввод) через перенаправление файлов:

0< FILENAME < FILENAME # Accept input from a file. # Companion command to ">", and often used in combination with it. # # grep search-word <filename

Если вы хотите использовать команду echo и | вместе (как указывает ответ Занны) вы можете использовать:

$ echo "hello" | cat > file.txt $ cat file.txt hello
0
ответ дан 17 July 2018 в 17:56

А я понимаю, о чем вы думали (я думаю). Вы пытались

echo hello | > file

, и ничего не случилось с file, поэтому вы подумали, может быть, мне нужно вывести вывод моей команды в stdin путем перенаправления:

echo hello >&0

Но поворот stdout в stdin - это именно то, что делает труба. Он принимает stdout и передает его команде справа от stdin. Если вы перенаправляете stdout, ничто не пройдет через трубу:

$ echo hello >&0 | cat > file hello $ cat file $

(ничего там)

Но hello вышел в терминал, который читается с stdin, как обычно :

$ cat /dev/fd/0 hi hi I am talking to myself! I am talking to myself!

и т. д. ...

Если мы не перенаправляем ...

$ echo hello | cat > file $ cat file hello

stdout of echo hello прошел (вместо терминала) и стал stdin cat.

Итак, труба делает то, что вы хотели сделать (поверните stdout в stdin и подключите его к правой команде), и вы

Что касается того, почему пустая команда с перенаправлением не делает то, что вы хотите, см. ответ muru.

12
ответ дан 17 July 2018 в 17:56

Я предполагаю, что вы хотите записать вывод в файл и stdout.

echo hello > file.txt

делает это частично, но пропускает стандартный вывод (ничего не выводит на консоль). Если вы тоже этого хотите, используйте команду tee, как показано ниже:

echo hello | tee file.txt

Он выводит вывод echo на вход tee, а затем записывает тэ на экран и в file.txt.

Если вы просто хотите напечатать файл, используйте команду cat, как показано ниже:

echo hello | cat >file.txt

Также проверьте этот ответ, как работают перенаправления: https: //stackoverflow.com/a/818265/5771279

и это для того, как работает труба: https://stackoverflow.com/a/818265/5771279

Посмотрите также на man-страницу команды tee.

5
ответ дан 23 July 2018 в 18:48
  • 1
    Я просто хочу записать файл. Почему эта команда ничего не делает: echo hello | & GT; file.txt – Prof-Wiz 28 March 2018 в 15:14
  • 2
    он делает :), записывает вывод в файл. В этом конкретном примере он просто очищает файл и ничего не пишет. Поскольку команда после того, как труба ничего не выводит (нет команды) – Levente M 28 March 2018 в 15:20
  • 3
    Это было хорошо прочитано. Не понимаю, почему «эхо-тест & gt; & amp; 0» по-прежнему печатает «тест». Выход эха будет stdin, поэтому ничего не должно выводиться – Prof-Wiz 28 March 2018 в 15:47
  • 4
    @ Prof-Wiz & quot; вывод эхо-сигнала будет stdin, поэтому ничто не должно выводить & quot; но в качестве ответа muru , stdin подключен к вашему терминалу (в режиме чтения / записи), поэтому все, что написано на stdin, все еще видно. В отличие от echo hello < /dev/null >&0 (где stdin берется из «нулевого устройства», но любой файл будет делать) вызывает ошибку, потому что stdin был открыт только для чтения и не может быть записан в. – TripeHound 28 March 2018 в 17:43
Символ > предназначен для перенаправления файлов для запуска файла. Символ >> предназначен для перенаправления файлов в конец файла (добавление). Символ | предназначен для «трубопровода» или передачи вывода из одной команды в качестве входа в другую команду. $ echo "Hello" > file.txt $ echo "World!" >> file.txt $ cat file.txt Hello World! $ cat file.txt | grep ! World!

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

&>0 согласно Руководство для сценариев Advanced-Bash:

&>filename # Redirect both stdout and stderr to file "filename." # This operator is now functional, as of Bash 4, final release.

В вашем случае имя файла было 0, которое является стандартным вводом. Таким образом, он перенаправляет все выходные данные на вход. Который, насколько я могу судить, это круговая ссылка, которая не сработает. Используемый вами синтаксис - это >&0, который перенаправляет вывод на вход.

«filenames»:

Символ > предназначен для перенаправления файлов для запуска файла. 1 стандартный вывод Символ >> предназначен для перенаправления файлов в конец файла (добавление).

Традиционный способ использования файлового дескриптора 0 (стандартный ввод) через перенаправление файлов:

0< FILENAME < FILENAME # Accept input from a file. # Companion command to ">", and often used in combination with it. # # grep search-word <filename

Если вы хотите использовать команду echo и | вместе (как указывает ответ Занны) вы можете использовать:

$ echo "hello" | cat > file.txt $ cat file.txt hello
0
ответ дан 23 July 2018 в 18:48
  • 1
    Вы можете также обратиться к >&0 – Sergiy Kolodyazhnyy 29 March 2018 в 04:12
  • 2
    @SergiyKolodyazhnyy Я старался изо всех сил, но не думаю, что это так здорово. 2>&1 всегда была моей ахиллесовой пятой. Это действительно ваша чашка чая, и вам будет приятно читать ваш ответ. – WinEunuuchs2Unix 29 March 2018 в 05:19

А я понимаю, о чем вы думали (я думаю). Вы пытались

echo hello | > file

, и ничего не случилось с file, поэтому вы подумали, может быть, мне нужно вывести вывод моей команды в stdin путем перенаправления:

echo hello >&0

Но поворот stdout в stdin - это именно то, что делает труба. Он принимает stdout и передает его команде справа от stdin. Если вы перенаправляете stdout, ничто не пройдет через трубу:

$ echo hello >&0 | cat > file hello $ cat file $

(ничего там)

Но hello вышел в терминал, который читается с stdin, как обычно :

$ cat /dev/fd/0 hi hi I am talking to myself! I am talking to myself!

и т. д. ...

Если мы не перенаправляем ...

$ echo hello | cat > file $ cat file hello

stdout of echo hello прошел (вместо терминала) и стал stdin cat.

Итак, труба делает то, что вы хотели сделать (поверните stdout в stdin и подключите его к правой команде), и вы

Что касается того, почему пустая команда с перенаправлением не делает то, что вы хотите, см. ответ muru.

12
ответ дан 23 July 2018 в 18:48

Другие вопросы по тегам:

Похожие вопросы: