Использовать 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-команды обычно работают только в интерактивной оболочке и, следовательно, не в скриптах.

Можно ли изменить этот параметр, чтобы значение !! интерпретировалось как последняя выполненная командная строка в скриптах? Как насчет псевдонимов, это возможно там?

6
задан 29 May 2015 в 17:59

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.

10
ответ дан 29 May 2015 в 17:59

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

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