Вы должны всегда (*) заключать свои переменные в кавычки, особенно если они содержат произвольный ввод пользователя.
В этом случае, если вы пишете сценарий с bash , используйте двойные скобки, чтобы не заключать кавычки (в этом случае 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
(*), кроме случаев, когда вы точно знаете , когда не хотите их цитировать.
С Bash, если вы включаете режим POSIX:
- Function names may not be the same as one of the POSIX special builtins.
- 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
(Без попытки запустить новую оболочку, что может быть запрещено в ограниченной оболочке.)