Почему амперсанд в URL вызывает ошибку следующей команды?

Я хочу открыть веб-страницу, запустив Safari в терминале, указав URL в качестве аргумента.

Это работает как ожидалось:

open -a safari "http://endic.naver.com/search.nhn?sLn=en&searchOption=all&query=good"

Но как только цитаты будут удалены, это не сработает так, как ожидалось:

open -a safari http://endic.naver.com/search.nhn?sLn=en&searchOption=all&query=good

Вместо этого он возвращает:

[3] 5395
[4] 5396
[1]   Done                    open -a safari http://endic.naver.com/search.nhn?sLn=en
[2]   Done                    searchOption=all

Похоже, что амперсанд в URL трактуется как "выполнение предыдущей команды в фоновом режиме", хотя после амперсанда в URL нет пробела.

1 ответ1

2

Амперсанд является разделителем команд (аналог точки с запятой ;), но указывает, что команда должна выполняться в фоновом режиме.

Если команда завершается оператором управления &, оболочка выполняет команду в фоновом режиме в подоболочке. Оболочка не ожидает завершения команды, и статус возврата равен 0. Команды, разделенные; выполняются последовательно; оболочка ожидает завершения каждой команды по очереди. Статус возврата - это статус выхода последней выполненной команды

Поэтому вы запустили три команды:

  • open -a safari "http://endic.naver.com/search.nhn?sLn=en в фоновом режиме
  • searchOption=all в фоновом режиме
  • query=good на переднем плане

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


хотя в URL нет пробела после амперсанда.

Это не нужно ни для & или ; завершить команду:

$ ls;pwd
Applications Desktop      Documents    Downloads    Library      Movies       Music
Pictures     Projects     Public       Work
/Users/danielbeck

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .