Убедитесь, что встроенная команда запускается в патологических обстоятельствах

Вы должны всегда (*) заключать свои переменные в кавычки, особенно если они содержат произвольный ввод пользователя.

В этом случае, если вы пишете сценарий с , используйте двойные скобки, чтобы не заключать кавычки (в этом случае bash умен), и используйте printf "% q" , чтобы заставить bash избежать того, что нужно экранировать:

ASOURCE="Home Photos 2012 camcorder" #example filename
if [[ -d $ASOURCE ]]; then
    # directory exists
    :
else
    # Note how these vars are quoted:
    echo "File does not exist:  $1"
    printf "DIR : %q\n" "$ASOURCE"
fi

(*), кроме случаев, когда вы точно знаете , когда не хотите их цитировать.

1
29.01.2019, 05:48
1 ответ

С Bash, если вы включаете режим POSIX:

  1. Function names may not be the same as one of the POSIX special builtins.
  2. POSIX special builtins are found before shell functions during command lookup.

Поскольку setи unsetявляются специальными встроенными функциями, вы можете получить к ним доступ через режим POSIX, а затем использовать их, чтобы избавиться от функций, а затем использовать \unalias, чтобы избавиться от псевдонимов:

$ for word in builtin command type  declare set unset unalias alias; do     eval "$word(){ echo $word function; };  alias $word='echo $word alias'"; done 
alias function
$ unalias  builtin command type unfunction declare set unset alias
unalias alias builtin command type unfunction declare set unset alias
$ POSIXLY_CORRECT=1
$ \unset -f builtin command type  declare set unset unalias alias
$ \unalias  builtin command type unfunction declare set unset alias
bash: unalias: unfunction: not found
bash: unalias: alias: not found

$ type -a builtin
builtin is a shell builtin

Но я не могу придумать пути назад, скажем:

enable -n set unset builtin command type  declare unalias alias typeset enable shopt

(Без попытки запустить новую оболочку, что может быть запрещено в ограниченной оболочке.)

3
27.01.2020, 23:23

Теги

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