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

Другие вопросы по тегам