
"ls -l | wc -l" выводит "1+кол-во файлов/каталогов" (дополнительный для первой строки).
Однако когда я запускаю команду ls -l | wc -l > temp (когда вывод перенаправляется в новый файл temp). Значение, сохраненное во временном файле, на 1 больше значения, которое было выведено без перенаправления. Я предполагаю, что это из-за создания нового файла "temp", но временный файл должен был быть создан после запуска команды ls -l, и, таким образом, вывод должен быть таким же, как и вывод без перенаправления.
Кто-нибудь, пожалуйста, помогите.
решение1
Это совершенно нормальное поведение.
Происходит следующее: оболочка (sh, bash, csh, ksh, что угодно) сначала считывает всю командную строку.
Затем создает процессы, каналы и файл(ы) перенаправления впорядок справа налевои только потом запускает реальные команды.
Итак, файл перенаправления (temp) создается ДО запуска команды ls.
Он должен быть таковым, поскольку дескриптор файла, связанный с "temp", должен быть доступен для использования в качестве назначения для вывода wc до фактического запуска wc.
В свою очередь, команда wc должна быть настроена до того, как вывод ls можно будет прикрепить к дескриптору файла, который будет входом для wc.
Хотя на первый взгляд это кажется немного нелогичным, это становится совершенно логичным, когда понимаешь, как оболочки выстраивают свою последовательность команд.
решение2
Оболочка на самом деле создает temp
файл до того, как начнет выполнять команды, поэтому вы всегда будете видеть, что temp
файл подсчитан. Если вы не хотите, чтобы он был подсчитан, поместите временный файл в другое место, например, в /tmp
. Или просто вычтите единицу из полученного количества.