Псевдонимы работают в AIX с Korn Shell.
Поместите несколько команд в конец вашего / etc / profile
, например:
export PS1="`hostname`# "
alias ll="/usr/bin/ls -lF $*"
alias h="history 50"
Если вы хотите, чтобы эти переменные устанавливались внутри вашей среды, запустите:
. /etc/profile
can you still recover if all three functions are marked readonly?
Да, обычно можно, но это не значит, что нужно.
Точно так же, как вы можете отменить установку переменных только для чтения , подключив отладчик и вызвав unbind_variable
, как показано в ответе anishsane на этот вопрос , вы также можете отменить установку функций только для чтения, передав их имена в unbind_func
с помощью отладчика.
Это неразумный подход, когда они не предназначены только для чтения (, если это действительно когда-либо ). В этой ситуации следует использовать решение cuonglm , в котором используется то, как unset
обрабатывается в режиме POSIX.Это решение можно использовать в реальной жизни.
Поскольку нет фактической гарантии, что ваша оболочка будет вести себя разумно после того, как вы обойдете readonly
с помощью отладчика, я предлагаю избегать ее всякий раз, когда есть более разумная альтернатива, такая как выход и перезапуск вашей оболочки или замена вашей оболочки на новую с помощью exec
.
С учетом сказанного, вот метод Анишсане , адаптированный для неустановленных функций вместо переменной:
cat <<EOF | sudo gdb
attach $$
call unbind_func("unset")
call unbind_func("builtin")
call unbind_func("command")
detach
EOF
Обратите внимание, что$$
расширяется до идентификатора процесса оболочки, потому что никакая часть EOF
в <<EOF
не заключена в кавычки.
Я протестировал это на версии Bash 4.3.48 (1 )-на Ubuntu 16.04 LTS, и это сработало. Для этого вам понадобится gdb
, хотя его можно адаптировать и для других отладчиков. Как прокомментировал anishsane , конвейер из cat
предназначен для избежания взаимоблокировки, когда процесс, который передает входные данные в gdb
, является тем, который gdb
был остановлен. Я считаю, что он достигает этой цели, потому что в конвейере из двух или более команд Bash выполняет каждую команду в подоболочке. Но я не уверен, что это самый надежный способ. В конечном счете, однако, нет реальной гарантии, что это все равно работает, поскольку для Bash вполне разумно предполагать, что переменные и функции только для чтения не изменятся. На практике я предполагаю, что это работает практически всегда.
Чтобы использовать эту технику, как написано, вам нужно установить sudo
и иметь возможность sudo
получить root права. Конечно, вы можете заменить его другим методом повышения привилегий -. В зависимости от того, какую ОС вы используете и как она настроена, вы можете вообще опустить sudo
и запустить gdb
от имени пользователя вместо пользователя root. Например, ядро Linux сверится со значением /proc/sys/kernel/yama/ptrace_scope
, которое вы можете установить с помощью sysctl и можете прочитать или (как root )записать, чтобы определить, какие процессы могут отлаживать другие процессы. Если значение равно 1
, то отлаживать его может только непосредственный родительский процесс --или любой процесс, запущенный с правами root --.В большинстве последних систем GNU/Linux для него установлено значение 1
, поэтому я включил sudo
.
Это описание поведения ядра Linux несколько упрощено, так как разрешены другие значения ptrace_scope
и что отношение, требуемое 1
, может быть скорректировано. Полную информацию см. всоответствующей документации .