Псевдонимы или Bash-алиасы ускоряют работу в командной строке Bash, позволяя сократить количество вводимых символов в именах часто используемых команд, а также избавляют от необходимости запоминания сложных последовательностей команд. Однако при попытке запуска псевдонима с правами суперпользователя через sudo
возникает проблема. Предлагаю рассмотреть причину её возникновения и варианты решения.
Например, на своём локальном веб-сервере я использую псевдонимы для управления Apache, объявив их в файле ~/.bash_aliases, подключаемом в файле ~/.bashrc.
# Запуск Apache
alias a2start='service apache2 start'
# Остановка Apache
alias a2stop='service apache2 stop'
# Перезапуск Apache
alias a2restart='service apache2 restart'
Теперь вместо трёх команд, мне достаточно выполнить одну, но для их запуска требуются права суперпользователя.
sudo a2start
Привычный вариант с использованием sudo
приводит к ошибке: “sudo: a2start: command not found”. Результат ожидаем, если ознакомиться с разделом Aliases руководства Bash: первое слово каждой команды проверяется на существование одноимённого псевдонима, если псевдоним найден, то это слово заменяется текстом псевдонима. Так, в приведённом примере Bash не интерпретирует a2start
, как псевдоним, вместо этого Bash обращается к команде a2start
, которая не существует и поэтому не может быть выполнена.
Первый вариант решения проблемы - добавить команду sudo
непосредственно в текст псевдонима.
# Запуск Apache
alias a2start='sudo service apache2 start'
# Остановка Apache
alias a2stop='sudo service apache2 stop'
# Перезапуск Apache
alias a2restart='sudo service apache2 restart'
Теперь запуск Apache выполняется одной командой с запросом ввода пароля, как в случае использования sudo
:
a2start
Второй вариант универсальнее - объявить псевдоним для команды sudo
. В моём случае в файл ~/.bash_aliases добавляется следующий псевдоним:
alias sudo='sudo '
Обязательно обратите внимание, что в тексте псевдонима после команды sudo
необходимо добавить пробел, который скажет Bash проверить следущее в командной строке после псевдонима sudo
слово. Если пробела не будет, то следующее за sudo
слово будет интерпретироваться Bash, как имя команды, а не как псевдоним, что снова приведёт к ошибке.
Какой из вариантов использовать - решать вам. Для себя я использую вариант с псевдонимом sudo
.
И, конечно, для того, чтобы вывести список всех зарегистрированных псевдонимов, используйте команду alias
.