TL; DR: Вы можете использовать sudo -iдля запуска функции , определенной /root/.bashrc(но не псевдоним) , а также имеет доступ к переменным , экспортируемым из этого файла:
аргументы команды sudo -i
Псевдонимы там не работают, но вы можете легко преобразовать их в функции, если хотите сделать их доступными sudo -i.
Читайте дальше для полного анализа и более подробной информации.
Здесь есть несколько проблем, некоторые в том, как работает sudo, а некоторые в том, как работает сам bash ...
По умолчанию sudoбудет искать только команды и обходить оболочку, поэтому простой запуск sudo llбудет работать, только если llв одном из каталогов находится исполняемый файл $PATH. Итак, чтобы использовать псевдонимы (или функции), вы должны убедиться, что оболочка вызывается как часть процесса.
Одним из способов было бы запустить что-то вроде sudo shили sudo bash, хотя современный sudo(я тестирую это на sudo 1.8.19p1) имеет опции -sи -iдля этой цели.
Таким образом, одна попытка будет выглядеть примерно так sudo -s ll(что эквивалентно sudo bash -c 'll'предположению, что вы $SHELL- Bash, что, кажется, имеет место на основе rcfileупомянутой вами информации). Но это тоже не работает, так как запускает оболочку в неинтерактивном режиме, не входящий в систему режим, который не читает ни один из его файлов запуска. По сути, это то же самое, что если вы пишете сценарий оболочки и используете его #!/bin/bashдля запуска. Псевдонимы (и функции), которые у вас есть ~/.bashrc, не будут доступны из этого скрипта ...
Итак, следующий -iвариант, который создает оболочку входа в систему. Это более перспективно, так как он будет читать ваши файлы запуска! И все же sudo -i ll(эквивалентно sudo bash -l -c 'll') все равно не будет работать. Так как это возможно, учитывая, что он прочитал определение llпсевдонима?
Что ж, следующим объяснением здесь является то, что по умолчанию bash не будет расширять псевдонимы, кроме случаев, когда оболочка является интерактивной ... Эта оболочка, запущенная sudo -i(или bash -l), является оболочкой входа , но все же не интерактивной.
Поэтому следующим шагом является получение интерактивной оболочки, которая затем работает :
sudo bash -i -c 'll'
(Иметь логин и интерактив тоже хорошо, конечно, bash -l -i -c ...будет работать.)
Другая альтернатива - продолжать использовать оболочку входа в систему (неинтерактивную), но явно попросить ее расширить псевдонимы, так что это также будет работать:
sudo bash -l -O expand_aliases -c 'll'
(В случае, когда bash был интерактивным , не требовалась оболочка входа в систему , поскольку этого достаточно для чтения файлов инициализации, но для этого нужно -lих прочитать.)
Это довольно длинные командные строки ... И они также требуют, чтобы вы указали всю команду оболочки в кавычках, поэтому, если вы вызываете псевдоним с аргументами, вам придется превратить все это в строку ... неуклюжий в использовании ...
Обратите внимание, что ранее я говорил об псевдонимах и функциях ... Это было сделано специально, поскольку функции здесь намного удобнее. Вам не нужно ничего особенного (например, наличие интерактивной оболочки или установка определенной опции) для выполнения функций в оболочке, если вы используете их определение.
Таким образом , если вы определили llкак функцию вместо псевдонима, вы сможете использовать его непосредственно SUDO в -iярлыке:
sudo -i ll
И если у вас более длинная командная строка с аргументами, вы можете передать их прямо здесь:
sudo -i ll -C -R /etc
(Сравнить с sudo bash -i -c 'll -C -R /etc'.)
Функции также более гибкие и, как правило, проще в обслуживании ... Обычно псевдоним легко преобразовать в функцию, единственное предостережение - всегда использовать "$@"там, где вы ожидаете получить дополнительные аргументы (обычно в конце псевдоним.)
Например, этот псевдоним:
alias ll='ls $LS_OPTIONS -l'
Может быть превращен в эту функцию:
ll () {
ls $LS_OPTIONS -l "$@"
}
Для большинства целей они эквивалентны. И, как упоминалось ранее, функция должна быть доступна непосредственно из sudo -i, так что это дополнительный бонус.
Я надеюсь, что вы найдете этот ответ и объяснение полезным!
/root/.bashrcно на самом деле то, что Q следует за псевдонимами из этого файла - это невозможно по этому вопросу - unix.stackexchange.com/questions/1496/… .