Mac OS X - расширение или ошибка по умолчанию для bash - PullRequest
1 голос
/ 29 октября 2010

Я пытаюсь запустить следующую строку скрипта в bash на Mac OS X 10.6.4 (из этот вопрос ):

$ export EDITOR='mvim -f -c "au VimLeave * !open -a Terminal"'

Увы, что я получаючто-то неожиданное:

$ echo $ EDITORmvim -f -c "au VimLeave Desktop Документы Файлы для загрузки Библиотека Фильмы Музыка Картинки Общедоступные сайты bin! open -a Terminal"

Ожидаемый результат:

$ echo $ EDITORmvim -f -c "au VimLeave *! open -a Terminal"

Чтобы исправить это, необходимо установить noglob, т.е. запустить set -f непосредственно перед назначением export.Тем не менее, возникает вопрос, является ли это ожидаемым поведением в Mac OS X, потому что (потому что noglob не установлено по умолчанию, то есть set +f) или потому что есть ошибка в bash в Mac OS X.

Версия bash:

$ bash --version
GNU bash, version 3.2.48(1)-release (x86_64-apple-darwin10.0)
Copyright (C) 2007 Free Software Foundation, Inc.

Может быть некоторая помощь на странице 329 из A practical guide to Unix for Mac OS X users: «Если не установлен noglob (страница 320), оболочка выполняет [расширение имени пути»] когда он встречает неоднозначную ссылку на файл - токен, содержащий любой из символов без кавычек &,?, [или]. ".Однако из-за того, что * находится внутри кавычек, остается вопрос: это поведение по умолчанию для bash или ошибка?

Это просто любопытство, но я был бы благодарен за любые мыслии ввод вы можете иметь.

Брайан

1 Ответ

7 голосов
/ 29 октября 2010

Ваша EDITOR переменная установлена ​​ правильно.Это можно увидеть, если выполнить:

echo "$EDITOR"

Взгляните на следующую расшифровку:


pax> export EDITOR='mvim -f -c "au VimLeave * !open -a Terminal"'

pax> echo $EDITOR
mvim -f -c "au VimLeave SecretCiaDoc.txt NsaEchelonKeys.txt !open -a Terminal"

pax> echo "$EDITOR"
mvim -f -c "au VimLeave * !open -a Terminal"

Ваша проблема не в выражении setно с твоим echo.set не будет расширять *, потому что он содержится в одинарных кавычках, но выполнение echo без кавычек будет его расширять.

Это никоим образом не влияет на программы, использующиепеременная окружения.


На основании вашего комментария:

Это все еще странно: * все еще в кавычках (двойные кавычки) для команды echo,a='abc "*" xyz'; echo $a не расширяется для меня ни в bash, ни в dash;на самом деле, он включает в себя кавычки в качестве второго аргумента.

Смотрите это:

pax> a='abc "*" xyz' ; echo $a
abc "*" xyz

pax> a='abc "* xyz' ; echo $a
abc "* xyz

pax> a='abc " * xyz' ; echo $a
abc " SecretCiaDoc.txt NsaEchelonKeys.txt xyz

pax> touch '"hello' ; a='abc "* xyz' ; echo $a
abc "hello xyz

Посмотрите, что происходит.Это не относится к " как к чему-то особенному, просто к другому персонажу.Причина, по которой он расширяется для вашего EDITOR, заключается в том, что он сам по себе.Когда вы используете "*", он на самом деле пытается расширить файлы, которые начинаются и заканчиваются на " - вы можете увидеть это в моем последнем примере выше.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...