Можно ли использовать так называемые 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-команды обычно работают только в интерактивной оболочке и, следовательно, не в скриптах.
Можно ли изменить этот параметр, чтобы значение !!
интерпретировалось как последняя выполненная командная строка в скриптах? Как насчет псевдонимов, это возможно там?
Расширение истории сделано перед расширением псевдонима, таким образом, необходимо будет использовать 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
.