$ _ проти! $. Останній аргумент попередньої команди та перенаправлення виводу


28

Питання стосується спеціальних змінних. Документація говорить:

!!:$

позначає останній аргумент попередньої команди . Це може бути скорочено до! $.


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

Має бути якась різниця, яку я не можу наздогнати, оскільки:

$ echo "hello" > /tmp/a.txt
$ echo "!$"
echo "/tmp/a.txt"
/tmp/a.txt

$ echo "hello" > /tmp/a.txt
$ echo $_
hello

Яка різниця?


4
! $ - це розширення історії, а не спеціальна змінна, тому я припускаю, що bash-код обробляє їх по-різному.
Джефф Шаллер

2
У мене немає остаточної відповіді на це питання, але: ① мову оболонки Bourne це один з, можливо , , хоча б внутрішньо несуперечливого мову програмування до сих пір широко використовується і сьогодні. Спроба вивести загальні принципи не приведе вас нікуди. Вам просто потрібно запам’ятати всі спеціальні правила. Вибачте. ② Зауважте слова "після розширення", відразу після виділеної вами фрази, у визначенні . Це важливо. Це може не пояснити різницю, яка вас спантеличує, але це пояснює купу інших способів, і це не те саме. $_$_!$
zwol

Відповіді:


32

!$це слово-позначення розширення історії, воно розширюється до останнього слова попередньої команди в історії . IOW, останнє слово попереднього запису в історії. Це слово, як правило, останній аргумент команди, але не у випадку перенаправлення. В:

echo "hello" > /tmp/a.txt

вся команда 'echo "hello" > /tmp/a.txt'з'явилася в історії, і /tmp/a.txtце останнє слово цієї команди.

_є параметром оболонки, він розширюється до останнього аргументу попередньої команди. Тут перенаправлення не є частиною аргументів, переданих команді, тому лише helloпередається аргумент echo. Ось чому $_розширено до hello.

_вже не є одним із стандартних спеціальних параметрів оболонки . Він працює в bash, zsh, mkshта dashтільки тоді , коли інтерактивними, ksh93тільки тоді , коли дві команди знаходяться на рознесених лінії:

$ echo 1 && echo $_
1
/usr/bin/ksh

$ echo 1
1
$ echo $_
1

1
Одним з ефектів !$розширення проти $_параметра є те, що echo $_в історії завжди відображається як echo $_, а echo !$показує значення, на яке воно було розширено. Наприклад , echo one twoтоді echo !$, то натискання на шоу echo two.
Джектоз
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.