Двойные кавычки делают «подстановку команд» одним единственным аргументом. Попробуйте без:
$ for i in $( printf 'abc\nxyz\n123 456\n'); do echo "????"; echo "$i"; done
????
abc
????
xyz
????
123 456
Кроме того, ваш IFS
установлен в строку, содержащую два символа "\" и "n". Например,. bash
, вы можете попробовать $'\n'
.
Да (для разумных реализаций и разумных определений)
Очевидно, что если у вас есть такая команда, как cat /etc/passwd
, то процесс будет выполнять вызовы open(2)
, чтобы открыть файл.
Чуть менее очевидно, что если у вас есть такая команда, как cat < /etc/passwd
, стоимость открытия файла также будет изменена на этот процесс, по крайней мере, для типичных реализаций оболочки. Оболочка обработает эту команду следующим образом.
cat
не является встроенной командой. Поэтому он создаст новый процесс для его запуска. Традиционно для этого используется системный вызов fork (2 ), но в наши дни в зависимости от системы могут использоваться системные вызовы vfork, clone или spawn. &
. open
, чтобы открыть файл, и сделает так, чтобы открытый файл находился в файловом дескрипторе 0. Есть по крайней мере несколько способов сделать это, но дело в том, что этот новый процесс вызывает open. cat
с помощью некоторой версии системного вызова exec
. cat
завершит работу, и исходная оболочка вернется из своего вызова wait
. Таким образом, в этом случае новый процесс также потребует затрат на настройку потока ввода-вывода. Конечно, затраты на настройку ввода-вывода обычно невелики по сравнению с реальным вводом-выводом.
С закрытием дела обстоят немного сложнее. Среда выполнения, связанная с программой, обычно очищает все буферы и закрывает открытые файлы. Время, затраченное на это, засчитывается в процессе. Когда процесс завершается, все оставшиеся открытые файлы закрываются. Стоимость выполнения этого может или не может быть учтена в процессе.
Если у вас есть что-то вроде FUSE, где другой процесс предоставляет файловую систему, то время, затраченное другим процессом на открытие, будет начисляться этому процессу, а не процессу, выполнившему вызов открытия.