Что заставляет оболочку интерпретировать эти перенаправления следующим образом?

Наблюдение как df кажется, не работает на Вас, не пытается выполнить это в корневом каталоге смонтированной файловой системы/диска. В моем случае я хотел бы видеть общую сумму пространства, использованного моим жестким диском ОС и проигнорировать все мои смонтированные файловые системы. Работал от /:

max@linux-vwzy:/> sudo du -h -d0 -x ./ 2> /dev/null
23G     ./

Таким образом, моя ОС поднимает 23 ГБ. Конечно, это только работает, если Вы знаете размер своего диска. Если я также индексирую другие файловые системы и диски:

max@linux-vwzy:/> sudo du -h -d0 ./ 2> /dev/null
2.6T    ./

Надежда, которая помогает. Это не лучший метод, но это просто могло бы работать на Вас.

2
08.04.2013, 20:14
2 ответа

Важно знать, что Ваша оболочка не перенаправляет вывод, но дескрипторы файлов. Каждый процесс в совместимой операционной системе POSIX имеет 3 потока ввода-вывода: STDIN, STDOUT и STDERR. > перенаправление перенаправляет дескриптор файла для потока STDOUT. Таким образом, то, что видит оболочка, поскольку она анализирует эта строка:

  1. cat test.txt - Хорошо, я запущу программу cat и дайте ему аргумент test.txt
  2. > dummy.txt - О, теперь я возьму дескриптор STDOUT cat процесс и подключение это в этот файл под названием "dummy.txt". Я не забочусь, было ли что-нибудь там прежде, я создам файл и усеку его для обнуления.
  3. > dummy2.txt - О, теперь я возьму дескриптор STDOUT cat процесс (что я ранее соединился с "dummy.txt") и подключает его к другому новому файлу. Я не могу сделать обеих вещей, потому что Вы перенаправляете, не обманывая дескрипторы файлов.

Это то, почему эта команда:

find / 2>&1 >/dev/null

результаты в выводе ошибок на STDOUT и никакой постоянный клиент (STDOUT) вывод, но этот:

find / >/dev/null 2>&1

результаты ни в каком выводе вообще. В первом случае мы помещаем STDERR в копию (дубликат) STDOUT, затем помещаем старый STDOUT в мусор. Во втором мы сначала помещаем STDOUT в мусор, затем копируем его (все еще указал /dev/null) и помещенный STDERR там, также.

4
27.01.2020, 21:55
  • 1
    Дублирование дескрипторов файлов очень отличается от дублирования вывода. –  Hauke Laging 08.04.2013, 20:46

От комментария до ответа, хотя часть этого является предположением:

Если Вы работаете в ударе,

cat test.txt > d1 > d2 > d3 > d4 > d5 

затем d1 через d4 будет пуст, и содержание test.txt будет в d5. Bash, кажется, выполняет фактическое перенаправление только для последнего обозначенного файла.

Любопытно, zsh (версия 5, по крайней мере) скопирует содержание test.txt во все посреднические файлы также.

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

Определенная часть страницы справочника читает следующим образом:

Note that the order of redirections is significant.  For example, the command

              ls > dirlist 2>&1

directs both standard output and standard error to the file dirlist, 
while the command

              ls 2>&1 > dirlist

directs  only the standard output to file dirlist, because the standard 
error was duplicated from the standard output before the standard output
was redirected to dirlist.

Это конкретно не покрывает ситуацию под рукой, но действительно указывает, что порядок проводит подсчет. По сути, наблюдение нечетного поведения при выполнении нечетных вещей (неоднократно перенаправляющий stdout к различным местам) может иметь удивительные результаты.

Я уверен, что кто-то приедет вскоре для исправления любой дикой местности (или умеренный) ошибки в этом speculation:-),

2
27.01.2020, 21:55
  • 1
    Этому не любопытно, это - несколько, которые функция IOs включила по умолчанию если при эмуляции других оболочек. zsh выполняет неявную мишень, когда fd несколько раз перенаправляется. См. документацию для деталей. –  Stéphane Chazelas 08.04.2013, 21:47

Теги

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