Добавление ярлыков команд в / bin

То, что вы читаете, применимо только к простым символам. Не символы внутри выражения скобки .

Фактически, это ясно сказано немного впереди:

Если не заключено в кавычки и находится вне скобок, следующие три символа будут иметь особое значение в спецификации шаблонов:

? 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 , ! и ".

8
03.05.2019, 10:02
3 ответа

Простым способом быстрого доступа является определение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
27
27.01.2020, 20:08

На самом деле то, что вы описываете, сработает, с некоторыми замечаниями:

  1. Вы можете просто поместить docker container lsв файл с именем /bin/dcls. Но поведение этого может быть немного сложным. Немного надежнее начинать файл со строки под названием «шебанг», поэтому файл будет выглядеть как
    #!/bin/sh
    docker container ls
    , что указывает на то, что файл является сценарием оболочки.
  2. Прежде чем вы сможете запустить команду, вы должны сделать исполняемый файл с помощью команды вроде
    chmod +x /bin/dcls
    Вам, вероятно, нужно быть root, чтобы сделать это (, то есть запустить его с помощьюsudo).
  3. Выполните два вышеуказанных шага, и вы сможете ввести 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для программ, идущих в комплекте с системой.

17
27.01.2020, 20:08

Если только для вас, псевдоним подходит, но в соответствии с Стандартом иерархии файловой системы Linux локальные системные -широкие сценарии идут в /usr/local/bin/, а не /bin.

  1. Хотя это определенно сработает в /bin, лучше придерживаться стандартов, особенно если ваше программное обеспечение будет развернуто на сайтах клиентов.
  2. Если ваш скрипт необязателен, он должен находиться в/opt
  3. Сам сценарий будет:

    #!/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
    
1
27.01.2020, 20:08

Теги

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