Во многом Linux записаны книги, то 'перенаправление выполняется перед командой'. Давайте рассмотрим:
$ cat bar
hello
$ ecno "foo" > bar
bash: ecno: command not found
$cat bar
Но это не копирует вывода в панель (так как нет никакого вывода), таким образом, это должно быть сказано 'перенаправление, выполняется ЧАСТИЧНО перед командой', так как одна часть'>' не работала здесь, а именно, копируя вывод команды в панель файла. Действительно ли это правильно?
От удара руководство разделяют 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 +++
Ну, вторая часть работала, в котором она скопировала пустой вывод в файл.
Например, если Вы перенаправляете stderr с 2>
вместо stdout Вы будете видеть, что ошибка превращает его в тот файл:
$ ecno "foo" 2> bar
$
И содержание "панели" обновляется к:
$ cat bar
-bash: ecno: command not found
То, что файл становится усеченным, является частью того, как перенаправление работает также.
Я надеюсь, что это помогает Вам понять, как перенаправление работает!