«ls -l | wc -l» выводит «1+№ файла / каталогов» (дополнительный для первой строки).

Однако когда я запускаю команду ls -l | wc -l> temp (когда вывод перенаправляется в новый файл temp). Значение, хранимое во временном файле, на 1 больше, чем значение, которое было выведено без перенаправления. Я предполагаю, что это из-за создания нового временного файла, но временный файл должен был быть создан после выполнения команды ls -l, и поэтому выходные данные должны совпадать с выходными данными без перенаправления.

Кто-нибудь, пожалуйста, помогите

2 ответа2

5

Это совершенно нормальное поведение.

В результате оболочка (sh, bash, csh, ksh и т.д.) Сначала читает всю командную строку.
Затем создает процессы, каналы и файл (ы) перенаправления в порядке справа налево и только затем запускает фактические команды.

Таким образом, файл перенаправления (temp) создается ДО запуска команды ls.
Это должно быть потому, что дескриптор файла, связанный с "temp", должен быть доступен для использования в качестве места назначения для вывода wc, прежде чем wc будет фактически запущен.
Команда wc, в свою очередь, должна быть настроена до того, как вывод ls может быть присоединен к дескриптору файла, который будет вводом для wc.

Хотя поначалу это кажется немного нелогичным, это имеет смысл, когда вы понимаете, как оболочки создают последовательность команд.

0

Оболочка фактически создает temp файл перед тем, как запустить команды, так что вы всегда будете видеть temp файл. Если вы не хотите, чтобы он учитывался, поместите временный файл в другое место, например, в /tmp . Или просто вычтите одно из полученного количества.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .