Переменная оболочки $ _ не работает должным образом

11

Чем отличается количество строк?

$ head -n 100000 ./access.log > ./data/log.sample
$ cat $_ | wc -l
1933424
Loom
источник
1
Также посетите Специальные параметры для bash
Pandya
1
В интерактивном контексте !$делает то , что вы хотели, но это не будет работать в сценарии IIRC.
Звол
@zwol: да. Я задал вопрос об этом.
Loom
Вы должны использовать teeкоманду в вашем скрипте.
Дити

Ответы:

26

$_расширяется до ./access.log(последний аргумент последней выполненной команды), а не ./data/log.sample.

Итак, вы на самом деле видите количество строк ./access.log.

Функция redirection ( >) не является частью headкоманды, так как она выполняется оболочкой еще до headзапуска команды. Следовательно с $_тобой получится ./access.log.


От man bash:

($ _, подчеркивание.) При запуске оболочки задайте абсолютный путь, используемый для вызова оболочки или сценария оболочки, выполняемого в том виде, как он был передан в среде или списке аргументов. Затем расширяется до последнего аргумента предыдущей команды после расширения. Также задайте полный путь, используемый для вызова каждой команды, выполненной и помещенной в среду, экспортированную в эту команду. При проверке почты этот параметр содержит имя почтового файла.

heemayl
источник
1
@ J.Chomel Я не уверен, что ты считаешь ошибкой, даже в шутку.
chepner