То, что вы читаете, применимо только к простым символам.
Не символы внутри выражения скобки
.
Фактически, это ясно сказано немного впереди:
Если не заключено в кавычки и находится вне скобок, следующие три символа будут иметь особое значение в спецификации шаблонов:
? A ...
*...
[Если открытая квадратная скобка вводит квадратное выражение ...
What , вы должны прочитать Выражение в скобках
здесь .
Согласно спецификации; Внутри «выражения в скобках» нет понятия цитирования (для шаблонов).
Однако большинство командных интерпретаторов удаляют кавычки в любой строке, даже если эта строка находится внутри «выражения в скобках». Вот почему ["!" A]
становится [! A]
для случая команды.
Однако оболочка сохраняет информацию о том, что строка была цитирована для большинства командных интерпретаторов, и поэтому отрицание не вступает в силу (в отличие от спецификации, не имеющей концепции цитирования внутри «Выражения в скобках» ).
В ksh и zsh эти знания не используются для оценки шаблона.
Почему так происходит? Я считаю, что это просто ошибки.
Однако ksh и zsh действуют иначе, чем большинство командных интерпретаторов.
Используя этот код (случай повторяется для проверки всех значений во всех оболочках):
whichsh="`ps -o pid,args| awk '$1=='"$$"'{print $2}'`"
[ ${whichsh##*/} = zsh ] && setopt GLOB_SUBST
[ ${whichsh##*/} = zsh4 ] && setopt GLOB_SUBST
a="$1"; printf '%s\t' "testing $a"
case $a in ['!a']) printf 1 ;; esac
case $a in ["!a"]) printf 2 ;; esac
case $a in ['!'a]) printf 3 ;; esac
case $a in ["!"a]) printf 4 ;; esac
case $a in [\"!\"a]) printf 5 ;; esac
case $a in [!a]) printf 6 ;; esac
printf "\t --"
t1="['!a']";t2='["!a"]';t3="['!'a]";t4='["!"a]';t5='[\"!\"a]'
case $a in $t1) printf 1 ;; esac
case $a in $t2) printf 2 ;; esac
case $a in $t3) printf 3 ;; esac
case $a in $t4) printf 4 ;; esac
case $a in $t5) printf 5 ;; esac
case $a in [!a]) printf 6 ;; esac
echo
Для теста с «a», ./ script.sh a
, результаты следующие:
/bin/dash : testing a 12345 --12345
/bin/sh : testing a 12345 --12345
/bin/b43sh : testing a 12345 --12345
/bin/b44sh : testing a 12345 --12345
/bin/bash : testing a 12345 --12345
/bin/ksh : testing a 5 --12345
/bin/ksh93 : testing a 5 --12345
/bin/lksh : testing a 12345 --12345
/bin/mksh : testing a 12345 --12345
/bin/zsh : testing a 5 --12345
/bin/zsh4 : testing a 5 --12345
И тест на «б», ./ скрипт.sh b
, результаты следующие:
/bin/dash : testing b 6 --6
/bin/sh : testing b 6 --6
/bin/b43sh : testing b 6 --6
/bin/b44sh : testing b 6 --6
/bin/bash : testing b 6 --6
/bin/ksh : testing b 12346 --6
/bin/ksh93 : testing b 12346 --6
/bin/lksh : testing b 6 --6
/bin/mksh : testing b 6 --6
/bin/zsh : testing b 12346 --6
/bin/zsh4 : testing b 12346 --6
Когда тестовые шаблоны содержат кавычки внутри переменных, кавычки не удаляются и не влияют на результат. Когда кавычки используются непосредственно в шаблоне, ksh и zsh удаляют кавычки и вычисляют [! A]
.
Все оболочки должны сохранять кавычки внутри скобок как часть тестируемых символов.
Чтобы получить кавычки "в кавычках", ksh и zsh нуждаются в шаблоне вроде [\ "! \" A]
. Тогда оба соответствуют a
, !
и "
.
Простым способом быстрого доступа является определениеalias
alias dcls='docker container ls'
Это выполнит docker container ls
, когда вы введете dcls
и команда alias
перечислит ваши определенные псевдонимы. Чтобы удалить этот псевдоним, используйте unalias dcls
.
Если вы используете bash, вы можете сохранить псевдоним в своем ~/.bashrc
или ~/.bash_aliases
.
Если ваш ~/.bash_aliases
не читается при запуске, вы можете добавить эту строку в свой~/.bashrc
:
[ -f ~/.bash_aliases ] &&. ~/.bash_aliases
На самом деле то, что вы описываете, сработает, с некоторыми замечаниями:
docker container ls
в файл с именем /bin/dcls
. Но поведение этого может быть немного сложным. Немного надежнее начинать файл со строки под названием «шебанг», поэтому файл будет выглядеть как #!/bin/sh docker container ls, что указывает на то, что файл является сценарием оболочки.
chmod +x /bin/dclsВам, вероятно, нужно быть root, чтобы сделать это (, то есть запустить его с помощью
sudo
). Выполните два вышеуказанных шага, и вы сможете ввести dcls
так и будет docker container ls
. Но если вы наберете dcls -l foo
, это все равно будет docker container ls
. Если вы хотите, чтобы это было сделано docker container ls -l foo
, вы должны изменить сценарий, чтобы сказать
#!/bin/sh docker container ls "$@"который указывает, что любые аргументы, которые вы вводите в командной строке
dcls
, следует передать команде docker container ls
. Естественно, есть вещи и посложнее вы можете сделать с аргументами строки команды -.
Для преобразования одна простая команда → одна простая команда, которым не нужно делиться с другими пользователями, проще определить псевдоним (, как предложил Фредди ), или функцию оболочки. Более сложные функции часто записываются в виде скриптов; т. е. текстовые файлы, содержащие команды. Но, если вам не нужно делиться им с другими пользователями, чаще используется частный каталог bin
.
$ cd # (to your home directory) $ mkdir binЗатем скопируйте
dcls
в $HOME/bin
, и добавьте export PATH="$HOME/bin:$PATH"к вашему
~/.bashrc
. Также принято помещать личные скрипты в /usr/local/bin
, и оставьте /bin
для программ, идущих в комплекте с системой.
Если только для вас, псевдоним подходит, но в соответствии с Стандартом иерархии файловой системы Linux локальные системные -широкие сценарии идут в /usr/local/bin/
, а не /bin
.
/bin
, лучше придерживаться стандартов, особенно если ваше программное обеспечение будет развернуто на сайтах клиентов. /opt
Сам сценарий будет:
#!/bin/bash
#
# Version 1.0 DD 2019-05-04
# dcls = docker container ls
docker container ls "@0"
if [[ $? -eq 0 ]]; then
echo -e "Errors encountered..."
exit 1
fi