Глобальный характер в переменной расширяется в Bash, но не ZSH

Обычно эффект, который вы упоминаете, возникает из-за того, что ядро ​​меняет видеорежим во время загрузки. В то же время он может загрузить новый шрифт, чтобы компенсировать (или использовать увеличенное разрешение).

Вот несколько статей, в которых обсуждается это:

1
08.08.2018, 22:38
1 ответ

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

Большинство людей ожидают

echo $file

для вывода содержимого переменной $fileи раздражаются, когда такие оболочки, как bash, не выполняют (поведение, унаследованное от оболочки Bourne, к сожалению, не исправленное ksh и заданное POSIX для shинтерпретатор ), и это вызывает множество ошибок и уязвимостей в системе безопасности, поэтому вам нужно заключать в кавычки все переменные в этих оболочках.

См., например,:Последствия для безопасности, если забыли заключить переменную в кавычки в оболочках bash/POSIX

Я вижу, что вы тоже этого ожидаете, когда пишете echo $0, а не echo "$0".

zshисправил это. По умолчанию при расширении параметра он не выполняет ни подстановки, ни разделения слов. Вам нужно запросить их явно:

  • echo $=file:выполнить разбиение слов
  • echo $~file:выполнить подстановку
  • echo $=~file:выполнить оба

Или вы можете включить параметры globsubstи shwordsplit, чтобы получить то же поведение, что и в Bourne -, например, в оболочках (эти два параметра включены, когда zshвызывается как shдля shсовместимость ), но я бы не рекомендовал, если вам не нужно zshинтерпретировать код, написанный для другой оболочки (, и даже в этом случае имеет смысл интерпретировать этот код в эмуляции shв локальный контекст сemulate -L sh).

Здесь имя вашей переменной fileв

file=*

вводит в заблуждение, если вы собираетесь расширять его после расширения¹

filename_pattern=*

будет иметь больше смысла. Если вам нужна переменная, содержащая имена всех не -скрытых файлов в текущем каталоге, вы должны сделать:

files=(*)

или:

files=(*(N))

чтобы это назначение не терпело неудачу, если в текущем каталоге нет не -скрытого файла.

То есть используйте назначение переменной массива . Это(file=(*))будет работать так же, как в bashили ksh93, mkshили yash, за исключением того, что zshне имеет другого недостатка оболочки Борна, из-за которого шаблон остается нераскрытым, когда есть не совпадает.


¹Обратите внимание, что *— вполне допустимое имя для файла в Unix-подобной -системе. Меня утешает то, что rm -f -- $fileудаляет файл, имя которого хранится в $file, даже если этот файл называется *.

14
27.01.2020, 23:12

Теги

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