Использовать 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,