Я использую Ubuntu 10.04 и использую его upstart
для управления демонами. Моё корпоративное приложение запускается как демон и должно запускаться как root из-за различных привилегий. Например:
sudo start my-application-long-ID
sudo stop my-application-long-ID
etc
Я хотел бы представить alias
аббревиатуру этих команд как что-то вроде:
alias startapp='sudo start my-application-long-ID'
и запустить его как startapp
и это работает, но я бы предпочел не иметь sudo в псевдониме.
alias startapp='start my-application-long-ID'
не при запуске с помощью sudo startapp
, возвращая sudo: startapp: command not found
.
Однако, когда я добавил псевдоним:
alias sudo='sudo '
sudo startapp
сейчас работает, но мне все еще интересно, почему sudo игнорирует псевдонимы.
source ~/.bashrc
? Это обновляет файл .bashrc и делает новые псевдонимы доступными?Ответы:
Я вижу ниже информацию отсюда .
При использовании sudo используйте расширение alias (иначе sudo игнорирует ваши псевдонимы)
Причина, почему это не работает, объясняется здесь .
источник
Псевдонимы и функции определены в оболочке. Sudo - это внешняя программа. Поэтому sudo не видит псевдонимы, функции или встроенные функции оболочки, только внешние команды.
Под псевдонимами подразумеваются альтернативные имена команд, поэтому оболочка раскрывает их только в позиции команды, а не в том случае, если они являются аргументами для команд. Zsh поддерживает глобальные псевдонимы, которые раскрываются в любом месте командной строки, и их лучше использовать экономно, так как существует риск их случайного расширения даже в тех случаях, когда псевдоним не имеет смысла.
Вы можете сказать Sudo для вызова оболочки:
sudo sh -c '…shell command here…'
. Однако ваши обычные псевдонимы не будут доступны внутри этой команды оболочки, поскольку они обычно хранятся в файле, таком как~/.bashrc
или~/.zshrc
который читается только интерактивными оболочками.alias sudo='sudo '
, как предложил Рамеш , заставляет оболочку расширять псевдонимы послеsudo
.источник
alias sudo='sudo '
на ZSH?Решение для пользователей Zsh
И в bash, и в zsh завершение псевдонима пробелом заставит оболочку псевдонимом-раскрыть следующее слово. Это позволяет что-то вроде следующего, чтобы расширить псевдоним
myalias
К сожалению, это разваливается, когда у вас есть более одного слова в вашем псевдониме (например
sudo -u someone
. Однако вы можете использовать zsh «глобальные псевдонимы», чтобы вручную расширять псевдонимы в любой части команды.Это создает глобальный псевдоним, который называется
$
(вы можете использовать любое слово), который заканчивается пробелом. Это заставляет zsh развернуть следующее слово как псевдоним обычной команды. Поскольку псевдоним расширяется до пробела, он не будет рассматриваться как аргумент. Это позволяет следующему работать.Вы даже можете использовать
$
несколько раз в одной командной строке, если у вас сложное командное вложение. Я нашел это достаточно полезным, так как он постоянно находится в моем zshrc, но псевдоним достаточно прост, чтобы определить, когда вам нужно его использовать.источник
Я просто дал альтернативный ответ здесь без переопределения
sudo
псевдонимом.В вашем случае это будет:
Все в одной строке, без дополнительных оболочек, без переопределения псевдонимов. ;-)
источник
xargs
чтобы раздеть цитаты, и grep, чтобы раздеть ведущие=
. Вроде умный, но, наверное, ненужный.eval "sudo $(alias aliasname | cut -d= -f2-)"
скорее всего лучше -xargs
не всегда будет правильно обрабатывать кавычки, и там может быть больше одного=
.xargs
не читайте цитаты. Именно grep принимает разрешенную команду между кавычками. Вы знаете,type -a alias_name
возвращает что-то вродеalias_name is aliased to command_within_quotes
. Кстати, я попробовал вашу команду и не работал на моем Ubuntu :-(. Это возвращениеtype -a
разных версий Linux (я сомневаюсь в этом).type
делает - вbash
. Вы понимаете, однако, что цитаты удвоены, верно? Вы пробовали это с псевдонимом, который содержал одинарные кавычки? Во всяком случае, вы правы моя вещь не работает - вам нужно либоeval "sudo sh -c "$(...
илиeval "'sudo $(alias alias_name| cut -d\' -f2-)"
. Дело в том, чтоalias
они в основном предварительно настроеныeval
-alias
утилита специально должна выводить их содержимое, чтобы его можно было безопасно переустановить в оболочку. Я думаю, что вашxargs
реализован, чтобы сгладить пробелы? Просто будь осторожен с этим, хорошо?