Перенаправление выполняется перед командой

Во многом Linux записаны книги, то 'перенаправление выполняется перед командой'. Давайте рассмотрим:

$ cat bar
hello
$ ecno "foo" > bar
bash: ecno: command not found
$cat bar
  1. Если панель не существовала бы, перенаправление было бы, создал его.
  2. Если панель существует, и команда не работала, она стирает содержание панели.

Но это не копирует вывода в панель (так как нет никакого вывода), таким образом, это должно быть сказано 'перенаправление, выполняется ЧАСТИЧНО перед командой', так как одна часть'>' не работала здесь, а именно, копируя вывод команды в панель файла. Действительно ли это правильно?

4
задан 2 August 2018 в 11:54

2 ответа

От удара руководство разделяют 3.6.2:

... если это действительно существует, это является усеченным для обнуления размера.

Перенаправление с > file всегда усекает файл перед выполняющейся командой, что означает, что содержание стирается независимо от вывода; фактическая запись в файл произойдет, если будет эффективная выходная мощность (прежде всего наблюдаемый с отсутствием write() призвать strace -f -e open,dup2,write bash -c 'true > out2.txt') и если никакая дальнейшая ошибка не происходит.

Поэтому все работает правильно согласно спецификациям, и формулировка корректна. На самом деле это поведение указано POSIX спецификации Командного языка Shell и поддерживается всеми совместимыми POSIX оболочками, включая ksh и dash (иначе Ubuntu /bin/sh, посмотрите связанный вопрос).


На системном уровне перенаправление выполняется семейством дубликатов системных вызовов, которое является, почему перенаправление официально называют, копируя дескрипторы файлов и является самым видным, когда мы выполняем >/dev/null 2&>1 тип перенаправления.

Это может наблюдаться с strace команда в следующем примере успешной и неудавшейся команды. Отметьте, как файлы открыты с O_CREAT|O_TRUNC флаг.

$ strace -f -e open,dup2,write bash -c 'nocommand > out.txt;echo "foobar" > out2.txt'
...
strace: Process 9633 attached
[pid  9633] open("out.txt", O_WRONLY|O_CREAT|O_TRUNC, 0666) = 3
[pid  9633] dup2(3, 1)                  = 1
...
...
[pid  9633] write(2, "bash: nocommand: command not fou"..., 35bash: nocommand: command not found
) = 35
[pid  9633] +++ exited with 127 +++
--- SIGCHLD {si_signo=SIGCHLD, si_code=CLD_EXITED, si_pid=9633, si_uid=1000, si_status=127, si_utime=0, si_stime=0} ---
open("out2.txt", O_WRONLY|O_CREAT|O_TRUNC, 0666) = 3
dup2(3, 1)                              = 1
write(1, "foobar\n", 7)                 = 7
dup2(10, 1)                             = 1
+++ exited with 0 +++
8
ответ дан 1 December 2019 в 08:58

Ну, вторая часть работала, в котором она скопировала пустой вывод в файл.

Например, если Вы перенаправляете stderr с 2> вместо stdout Вы будете видеть, что ошибка превращает его в тот файл:

$ ecno "foo" 2> bar
$

И содержание "панели" обновляется к:

$ cat bar
-bash: ecno: command not found

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

Я надеюсь, что это помогает Вам понять, как перенаправление работает!

2
ответ дан 1 December 2019 в 08:58

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

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