Использовать bang-команды (например, '!!') bash в сценариях и псевдонимах?
Можно ли использовать так называемые bang-команды (!
+ команда / символ, например, например !!
или же !$:p
) в скриптах bash и в псевдонимах bash?
Я хотел добавить строку
alias getit='sudo apt-get install !!'
к моему ~/.bashrc
файл, чтобы можно было установить команду not found, набрав getit
после неудачного вызова самой команды, похожей на поведение инструмента The Fuck, просто с меньшей ругательством...
Тем не менее, эта строка не работает, как видно из вывода ниже:
$ cowsay
The application »cowsay« is currently not installed.
You can install it by typing:
sudo apt-get install cowsay
$ getit
Reading package lists... Done
Building dependency tree
Reading state information... Done
E: Unable to locate package !!
$
Обратите внимание, что я перевел вывод первой команды с немецкого, как LANG=C
не работал над этим... По какой-то причине.
В любом случае, вы можете видеть, что команда bang в псевдониме не интерпретируется как замена последней выполненной командой, а остается той же самой строкой. Я уже выяснил, что bang-команды обычно работают только в интерактивной оболочке и, следовательно, не в скриптах.
Можно ли изменить этот параметр, чтобы !!
интерпретируется как последняя выполненная командная строка в скриптах? Как насчет псевдонимов, возможно ли это там?
1 ответ
Расширение истории выполняется до раскрытия псевдонима, поэтому вам придется использовать history
встроенный, чтобы выполнить расширение самостоятельно:
alias getit='sudo apt-get install $(history -p !!)'
Однако указанный выше псевдоним использует всю последнюю выполненную команду в качестве аргумента для sudo apt-get install
, что означает, что если бы мы дали аргумент неудачной команде (например, cowsay "Hello"
), теперь мы также должны иметь этот аргумент, появляющийся в списке пакетов для установки (sudo apt-get install cowsay "Hello"
).
Поскольку это не предназначено, мы должны изменить псевдоним в соответствии с предложением SteelDriver и использовать !:0
вместо !!
чтобы получить только первое слово (название команды):
alias getit='sudo apt-get install $(history -p !:0)'
Мы по-прежнему должны позаботиться о том, чтобы эта процедура работала, только если имя ошибочной команды и ее имя пакета совпадают. Например, это не будет работать для команды lynx
(CLI-браузер), потому что он включен в пакет lynx-cur
,