Последовательные цветовые схемы из проекта colorbrewer будут работать: https://github.com/aschn/gnuplot-colorbrewer
Только внешние команды могут выполняться sudo
.
Программа sudo
разветвляет (запускает) новый процесс для запуска внешней команды с эффективными привилегиями суперпользователя (или другого пользователя, если параметр -u
используется). Это означает, что нельзя указать команды, которые являются внутренними для оболочки; сюда входят ключевые слова, встроенные команды, псевдонимы и функции оболочки.
Лучший способ узнать, доступна ли команда как внешняя (а не внутренняя для оболочки) - это запустить type -a имя_команды
, который отображает все места, содержащие указанный исполняемый файл.
В этом случае команда cd
доступна только как встроенная оболочка:
$ type -a cd
cd is a shell builtin
Не удается запустить ее с помощью sudo
:
$ sudo cd /
sudo: cd: command not found
В этом случае команда ls
является внешней, но в оболочке пользователя также был создан псевдоним с тем же именем.
$ type -a ls
ls is aliased to `ls -F --color'
ls is /bin/ls
Если бы я запустил sudo ls
, это был бы не псевдоним, который запускается как суперпользователь; если бы мне нужна была опция -F
, ее нужно было бы явно включить в качестве опции, то есть sudo ls -F
.
В этом случае команда pwd
предоставляется как встроенная, так и внешняя команда оболочки:
$ type -a pwd
pwd is a shell builtin
pwd is /bin/pwd
В этом случае внешняя ] / bin / pwd
команда будет запускаться с sudo
:
$ sudo pwd
/home/anthony
Другими примерами команд, которые часто предоставляются как встроенные, так и внешние команды оболочки, являются kill
, тест
( [
) и эхо
.
Если вы действительно хотите запустить встроенную оболочку с привилегиями суперпользователя, вам придется запускать оболочку как внешнюю команду. Например, следующая команда запускает bash
от имени суперпользователя со встроенной командой cd
, предоставленной как параметр командной строки:
$ sudo bash -c "cd /; ls"
bin etc lib media mnt ntp.peers proc sbin share sys
tmp var boot dev home lost+found misc net opt … …
Примечание. Псевдонимы не могут быть переданы в качестве команд в Bash, используя его -c
вариант.
Еще одна проблема, на которую следует обратить внимание, заключается в том, что перенаправление оболочки происходит в контексте текущей оболочки. Если я попытаюсь запустить sudo / bin / echo abc> /test.file
, это не сработает. Я получаю -bash: /test.file: Permission denied
. Хотя команда echo выполняется с привилегиями суперпользователя, она выводит свой вывод в мою текущую (непривилегированную) оболочку, и, как обычный пользователь, у меня нет разрешения на запись в каталог /
.
Одним из способов решения этой проблемы является использование sudo
для запуска новой оболочки (аналогично приведенному выше примеру):
sudo bash -c "echo abc > /test.file"
В этом случае перенаправление вывода происходит в контексте привилегированного shell (у которого есть разрешение на запись в /
).
Другое решение - запустить команду tee
от имени суперпользователя:
echo abc | sudo tee /test.file
ll
не работает с sudo, потому что это псевдоним. Псевдонимы не работают с sudo, так как вы не получите интерактивную оболочку с sudo (если не попросите специально)
cd
- это другой случай, так как не имеет смысла переходить в каталог, на который у вас нет прав с sudo.
Как и предполагалось, многие встроенные модули не будут работать с sudo, но другие работают, в частности kill
. Вам нужно выполнить sudo kill
, чтобы убить процесс, запущенный пользователем, отличным от вашего.
cd
или ll
— это не программа, а встроенная команда оболочки. Вы можете просмотреть все доступные встроенные команды, используя следующую команду.
compgen -b
sudo
не будет работать со всеми этими командами.