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/… .