Что делает! Средний $?

Обычно синтаксис, где [...] используется для указания на дополнительный args и '|', используется для указания на логическое ИЛИ используется в большинстве страниц справочника. Это зависит, кто пишет страницу справочника, поскольку нет никаких полномочий, которые диктуют то, как что должна читать страница справочника. Более характерный для Вашего вопроса однако, чтения страницы справочника, верные в этом случае. Или можно указать URL через переключатель-i, или можно предоставить сам URL. Таким образом, можно думать об опциях как "условно дополнительных". Действительно это должно, вероятно, считать что-то как

      ([option (excluding -i)] (-i file | URL)) 

но Вы видите, как это быть сложным очень быстро. Таким образом, необходимо взять быстрые описания с мелкой частицей соли. По моему опыту, синтаксис команды обычно является наименьшим количеством Ваших забот.

Кроме того, я - гнида, выбирающая здесь, но что Вы видите, не regex ;)

32
30.08.2013, 00:26
3 ответа

В основном это - последний аргумент предыдущей команде.

!$ "конец" предыдущей команды. Рассмотрите следующий пример: Мы запускаем путем поиска слова в файле:

grep -i joe /some/long/directory/structure/user-lists/list-15

если joe находится в этом userlist, мы хотим удалить его из него. Мы можем или разжечь vi с тем длинным деревом каталогов как аргумент, или так же просто как vi !$ До которого расширяется удар:

vi /some/long/directory/structure/user-lists/list-15

(источник; удобное руководство, между прочим)


Это ничего не стоит различие между этим !$ маркер и специальная переменная оболочки $_. Действительно, оба расширяются до последнего аргумента предыдущей команды. Однако !$ расширен во время расширения истории, в то время как $_ расширен во время расширения параметра. Одно важное последствие этого - это, когда Вы используете !$, расширенная команда сохраняется в Вашей истории.

Например, рассмотрите нажатия клавиш

  • echo Foo Войти echo !$ Jar Фиксируйте входят; и

  • echo Foo Войти echo $_ Jar Фиксируйте входят.

(Единственные измененные символы $! и $_ в середине.)

В первом, когда Вы нажимаете Up, чтения командной строки echo Foo Jar, таким образом, последняя строка, записанная в stdout, Foo Jar.

В последнем, когда Вы нажимаете Up, чтения командной строки echo $_ bar, но теперь $_ имеет другое значение, чем оно сделало ранее — действительно, $_ теперь Jar, таким образом, последняя строка, записанная в stdout, Jar Jar.

Другое последствие - это _ может использоваться в других расширениях параметра, например, последовательности команд

printf '%s '    isomorphism
printf '%s\n'   ${_%morphism}sceles

печать isomorphism isosceles. Но там не аналогично"${!$%morphism}"расширение.

Для получения дополнительной информации о фазах расширения в Bash, посмотрите EXPANSION раздел man 1 bash (это называют Расширениями Shell в интернет-версии издания). HISTORY EXPANSION участок является отдельным.

44
27.01.2020, 19:37
  • 1
    Хороший. Хороший для знания. Кроме того, хорошей вещью там является Exchange Стека. Трудно искать Google что-то как !$ –  Andrew 29.08.2013, 08:27
  • 2
    BTW, на командной строке, можно вставить последний аргумент предыдущей команды insert-last-argument, обычно связываемый с M-.. –  choroba 29.08.2013, 09:25
  • 3
    @Andrew не забудьте принимать это, если он отвечает на Ваш вопрос. При принятии и upvoting вместо того, чтобы добавить комментарии - то, как благодарность выражена в сети SE, посмотрите здесь для "официальной" позиции. –  terdon♦ 29.08.2013, 14:18
  • 4
    @Andrew к вашему сведению, я искал Google "доллар удара удара" и получил достойные результаты, включая эту ссылку как третий список. –  wchargin 29.08.2013, 16:14
  • 5
    @terdon я пытался принять ответ вчера вечером, но это было настолько быстро, что я был вынужден ожидать для принятия его. –  Andrew 29.08.2013, 17:36

Строго говоря ! $ - это последнее слово последней команды из списка истории.

слово - последовательность символов, рассматриваемая оболочкой как единое целое. Слова не могут содержать метасимволы без кавычек.

метасимвол - символ, который без кавычек разделяет слова. Метасимвол - это пробел или один из следующих символов: '|', '&', ';', '(', ')', '<' или '>'

пробел - пробел или символ табуляции. .

Примеры:

set -o history # enable command history
set -o histexpand # enable ! style history substitution

HISTSIZE=10

# save all lines on the history list    
HISTCONTROL=
HISTIGNORE=

date
echo !$ # prints date

date>/dev/null
echo !$ # prints /dev/null

echo a b c>/dev/null
echo !$ # prints /dev/null

HISTCONTROL=ignorespace # lines which begin with a space character are not saved in the history list
echo a b c
 echo d e f # space at the beginning
echo !$ # prints c
4
27.01.2020, 19:37

!$даст вам последнюю команду, использованную для этого конкретного пользователя....

вы также можете найти историю команд, использованных ранее, с помощью команды history... попробуйте....

ПРИМЕЧАНИЕ. :Для конкретного пользователя все использованные ранее команды будут храниться в файле истории bash.

-3
27.01.2020, 19:37

Теги

Похожие вопросы