Как отключить ключевое слово оболочки?

Какую версию zsh Вы используете?

Вы попробовали без какого-либо .zshrc вообще? Поскольку с версией ZSH я имею здесь, это - поведение по умолчанию - без дальнейшей конфигурации.

4
13.04.2017, 15:22
4 ответа

Вы не можете отключить его, но можете скрыть с помощью функции. Используйте на свой страх и риск.

shell_builtin() {
    :  ## Do nothing.
}

Чтобы снова включить его, просто отключите его:

unset shell_builtin
-2
27.01.2020, 20:51

Вы можете:

alias time='"time" '

(конечный пробел предназначен для расширения псевдонима после него, в качестве бонуса).

Заключение в кавычки ключевого слова (ключевые слова являются частью синтаксиса языка оболочки) предотвращает его интерпретацию как ключевое слово, поэтому здесь по нему выполняется обычный поиск команд.

Он работает в bash , zsh , mksh , но не в ksh93 , ash или ] Яш .

Обратите внимание, что для неинтерактивных экземпляров bash (например, в скриптах) вам потребуется shopt -s expand_aliases , в отличие от других командных интерпретаторов, bash не По умолчанию псевдонимы не раскрываются, если они не интерактивны.

6
27.01.2020, 20:51

Как вы узнали, вы не можете отключить ключевое слово с помощью enable -n .

Однако вы можете сделать ключевое слово встроенным с помощью enable -f , а затем отключить его:

  • распаковать исходники для вашей текущей версии bash
  • ./ configure && make
  • В examples / loadables вы найдете несколько примеров загружаемых встроенных команд, отредактируйте одну из них, например, sync , чтобы заменить все экземпляры синхронизировать с временем .
  • запустите make в examples / loadables .
  • В bash запустите enable -f ./sync time .
  • enable -n time теперь работает. И help показывает: * time (в дополнение к time [-p] pipeline )

(не то чтобы это когда-либо было кому-либо полезно) .

2
27.01.2020, 20:51

Вместо того, чтобы отключать ключевое слово, если вы можете вызвать его без того, чтобы синтаксический анализатор оболочки нашел его в позиции команды - или в первом слове простой команды - вы сможете запустить его без проблем. Указанная в POSIX команда команда предназначена именно для этого. Так, например, вы можете вызвать команду time , например:

command time

Насколько я могу судить, это работает в любой оболочке. Однако странно, что многие, кажется, относятся к этому иначе. Вот демонстрация:

echo 'echo "$0"' >./time
chmod +x ./time
for sh in dash ksh zsh bash yash 'busybox ash' posh mksh
do  command -p $sh -c '
    PATH=.:$PATH
    printf "\n%s\n" "$0"
    time
    command time' "$sh"
done 

OUTPUT

dash
./time
./time

ksh
user    0m0.00s
sys     0m0.00s
time

zsh
shell  0.00s user 0.00s system 71% cpu 0.005 total
children  0.00s user 0.00s system 0% cpu 0.005 total
time

bash

real    0m0.000s
user    0m0.000s
sys     0m0.000s
./time

yash
./time
./time

busybox ash
./time
./time

posh
./time
./time

mksh
    0m0.00s user     0m0.00s system
./time
1
27.01.2020, 20:51

Теги

Похожие вопросы