Мой $ PATH выглядит так:
/home/torbjorr/deployed/vector/x86_64-GNU%2fLinux:/home/torbjorr/deployed/typewriter/x86_64-GNU%2fLinux:/home/torbjorr/deployed/mustudio/x86_64-GNU%2fLinux:/home/torbjorr/deployed/mathext/x86_64-GNU%2fLinux:/home/torbjorr/deployed/doxymax/x86_64-GNU%2fLinux:/home/torbjorr/deployed/c2tex/x86_64-GNU%2fLinux:/home/torbjorr/deployed/x86_64-GNU%2fLinux/wand:/home/torbjorr/deployed/x86_64-GNU%2fLinux/spellesc:/home/torbjorr/deployed/x86_64-GNU%2fLinux/projinit:/home/torbjorr/deployed/x86_64-GNU%2fLinux/herbs:/home/torbjorr/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games
В bash я могу без проблем вызвать палочку, расположенную в
/home/torbjorr/deployed/x86_64-GNU%2fLinux/wand
нравиться
$ wand
(i) Mål från "main.cpp" har registrerats
(i) Skapar katalog "__wand_targets_dbg"
(i) Kör g++ "main.cpp" -fpic -L"/home/torbjorr/deployed" -g -Wall -std=c++11 -I"/home/torbjorr/deployed" -o "__wand_targets_dbg/cb-template
Однако в режиме совместимости с оболочкой Bourne палочка не может быть найдена:
$ wand
sh: 2: wand: not found
Кажется, проблема в том, что знак% в этих путях. Этот знак был добавлен путем кодирования URL, поэтому имя «GNU / Linux» можно использовать в имени каталога, даже если это недопустимое имя файла. Можно ли заставить имя работать в sh или заставить команду sh работать как bash. То есть make bash ведет себя так же, даже если он был вызван с помощью команды / bin / sh, которая в любом случае ссылается на bash.
sh
(это нормальноbash
иzsh
хотя). Прямой вызов исполняемого файла работает вsh
; действительно странно.Ответы:
Это не оболочка Bourne или
bash
эмуляция оболочки Bourne, это оболочка Almquist, в вашем случае, вероятно, оболочка Debian Almquist (форк Linux от Debian BSD, основанный на оригинальной оболочке Almquist).В оболочке Almquist (оригинальной и современной версиях),
%
используетсяPATH
для дополнительных функций, специфичных дляash
. Цитирование из документации:Другие оболочки любят
ksh
илиzsh
имеют похожий механизм автозагрузки функций, но они используют другую переменную ($FPATH
), но вы не можете определить, какая из функций или исполняемых файлов имеет приоритет.В вашем случае
/home/torbjorr/deployed/vector/x86_64-GNU%2fLinux
интерпретируется как/home/torbjorr/deployed/vector/x86_64-GNU
каталог с2fLinux
флагом. Этот флаг игнорируется, поскольку он неизвестен.Обойти это невозможно. Даже если бы у золы был механизм сброса, чтобы с ним
%
не обращались специально, он не работал бы в других оболочках или других вещах, которые выглядят$PATH
какexecvp()
.Вам нужно удалить
%
символы$PATH
, поэтому переименуйте каталог или добавьте символическую ссылку.Или не используйте
ash
для своего/bin/sh
. Другие легкие реализации оболочки POSIX, которые этого не делают, включаютyash
иmksh
.источник
sh
нарушает стандарт POSIX. Учитывая, что смысл иметь отдельноеsh
- именно то, что вы должны быть уверены, что не перепутали какое-то несовместимое расширение оболочки (я думаю, что никто не использует в/bin/sh
качестве оболочки для входа в систему в наши дни), я бы посчитал это ошибкой.ash
for / bin / sh больше, чтобы избежать снижения производительности при использованииbash
, поэтому использованиеyash
илиmksh
(илиposh
если вы хотите исключить все расширения) все же лучше, чем использованиеbash
. Также можно считать это угловым случаем. Никто обычно не имеет%
в компоненте пути. У большинства оболочек есть угловые случаи, когда они не соответствуют POSIX.[
команды, даже если этот символ отсутствует в PFCS.