Moja $ PATH wygląda następująco:
/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
W bashu mogę bez problemu wywołać różdżkę znajdującą się w
/home/torbjorr/deployed/x86_64-GNU%2fLinux/wand
lubić
$ 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
Jednak w trybie zgodności z powłoką Bourne'a nie można znaleźć różdżki:
$ wand
sh: 2: wand: not found
Wygląda na to, że problemem jest znak% na tych ścieżkach. Ten znak został dodany przez kodowanie URL, więc nazwa „GNU / Linux” może być używana w nazwie katalogu, nawet jeśli nie jest to poprawna nazwa pliku. Czy to możliwe, aby nazwa działała w sh, lub sprawić, aby polecenie sh działało jako bash. Oznacza to, że bash zachowuje się tak samo, mimo że został wywołany za pomocą polecenia / bin / sh, które i tak łączy dowiązania symboliczne.
sh
(jest w porządkubash
izsh
mimo to). Bezpośrednie wywołanie pliku wykonywalnego działa wsh
; naprawdę dziwne.Odpowiedzi:
To nie jest powłoka Bourne'a, ani
bash
emulująca powłoka Bourne'a, to powłoka Almquista, w twoim przypadku prawdopodobnie powłoka Debiana Almquist (rozwidlenie Linuksa autorstwa samego Debiana z BSDs oparte na oryginalnej powłoce Almquist).W skorupie Almquist (oryginalna i współczesna wersja)
%
zastosowanoPATH
dodatkowe funkcje charakterystyczne dlaash
. Cytowanie z dokumentacji:Inne pociski lubią
ksh
lubzsh
mają podobny mechanizm funkcje automatyczne ładowanie, ale użyć innej zmiennej ($FPATH
), ale nie można określić, która z funkcji lub pliki wykonywalne mają pierwszeństwo.W twoim przypadku
/home/torbjorr/deployed/vector/x86_64-GNU%2fLinux
jest interpretowany jako/home/torbjorr/deployed/vector/x86_64-GNU
katalog z2fLinux
flagą. Ta flaga jest ignorowana, ponieważ nie jest znana.Nie można tego obejść. Nawet jeśli popiół miał mechanizm ucieczki, tak, że ten
%
nie może być traktowany specjalnie, byłoby to nie praca w innych skorup lub innych rzeczy, które wyglądają się$PATH
jakexecvp()
.Musisz usunąć
%
znaki z$PATH
, więc zmień nazwę katalogu lub dodaj dowiązanie symboliczne.Lub nie używaj
ash
do swojego/bin/sh
. Inne lekkie implementacje powłoki POSIX, które tego nie robią, obejmująyash
imksh
.źródło
sh
narusza standard POSIX. Biorąc pod uwagę, że oddzielnesh
jest dokładnie to, że powinieneś być pewien, że nie potkniesz się o jakieś niekompatybilne rozszerzenie powłoki (chyba nikt nie używa obecnie/bin/sh
powłoki logowania), uważam to za błąd.ash
for / bin / sh jest więcej, aby uniknąć obniżenia wydajnościbash
, więc używanieyash
lubmksh
(lubposh
jeśli chcesz wykluczyć wszystkie rozszerzenia) jest nadal lepszą opcją niż używaniebash
. Można również uznać to za przypadek narożny. Nikt normalnie nie miałby%
elementu ścieżki. Większość powłok ma narożne przypadki, w których nie są zgodne z POSIX.[
polecenia, mimo że tego znaku nie ma w PFCS.