Змінна оболонки $ _ не веде себе так, як очікувалося


11

Чим відрізняється кількість рядків?

$ head -n 100000 ./access.log > ./data/log.sample
$ cat $_ | wc -l
1933424

1
Також відвідайте Спеціальні параметри для bash
Pandya

1
В інтерактивному контексті !$робиш те, що ти хотів, але це не буде працювати в сценарії IIRC.
zwol

@zwol: Так. Я задав питання про це.
Loom

Ви повинні використовувати teeкоманду у своєму сценарії.
Діті

Відповіді:


26

$_розширюється до ./access.log(останній аргумент останньої виконаної команди), не ./data/log.sample.

Таким чином, ви насправді бачите кількість рядків ./access.log.

Перенаправлення ( >) не є частиною headкоманди, оскільки це робиться оболонкою до того, як headкоманда навіть буде запущена. Значить, з $_тобою дістанешся ./access.log.


Від man bash:

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


1
@ J.Chomel Я не впевнений, що ви вважаєте помилкою, навіть на жарт.
чепнер
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.