Mein $ PATH sieht so aus:
/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
In der bash kann ich problemlos den in befindlichen Zauberstab aufrufen
/home/torbjorr/deployed/x86_64-GNU%2fLinux/wand
mögen
$ 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
Im Bourneshell-Kompatibilitätsmodus kann der Zauberstab jedoch nicht gefunden werden:
$ wand
sh: 2: wand: not found
Das Problem scheint das% -Zeichen in diesen Pfaden zu sein. Dieses Zeichen wurde durch URL-Codierung hinzugefügt, sodass der Name "GNU / Linux" im Verzeichnisnamen verwendet werden kann, obwohl es sich nicht um einen gültigen Dateinamen handelt. Ist es möglich, den Namen in sh zum Laufen zu bringen, oder den Befehl sh als bash auszuführen? Dies bedeutet, dass Bash sich genauso verhält, obwohl es mit dem Befehl / bin / sh aufgerufen wurde, der sowieso auf Bash verweist.
sh
(es ist inbash
undzsh
obwohl in Ordnung). Das direkte Aufrufen der ausführbaren Datei funktioniertsh
. wirklich seltsam.Antworten:
Das ist nicht die Bourne-Shell oder die
bash
Emulation der Bourne-Shell, das ist die Almquist-Shell, in Ihrem Fall wahrscheinlich die Debian-Almquist-Shell (ein Linux-Fork von Debian, der auf der ursprünglichen Almquist-Shell basiert).In der Almquist-Shell (die ursprüngliche und die moderne Version)
%
wird inPATH
für zusätzliche Funktionen verwendet, die spezifisch sindash
. Zitat aus der Dokumentation:Andere Shells mögen
ksh
oderzsh
einen ähnlichen automatischen Laden von Funktionen Mechanismus haben, aber sie verwenden eine andere Variable ($FPATH
), aber Sie können nicht , welche Funktionen oder ausführbare Dateien haben Vorrang definieren.In Ihrem Fall
/home/torbjorr/deployed/vector/x86_64-GNU%2fLinux
wird als/home/torbjorr/deployed/vector/x86_64-GNU
Verzeichnis mit dem2fLinux
Flag interpretiert . Dieses Flag wird ignoriert, da es unbekannt ist.Daran führt kein Weg vorbei. Auch wenn Asche hat so einen Flucht - Mechanismus , dass dies
%
nicht speziell behandelt werden, wäre es dann nicht die Arbeit in anderen Schalen oder anderen Dingen , die sehen$PATH
wieexecvp()
.Sie müssen die
%
Zeichen aus entfernen$PATH
, also benennen Sie Ihr Verzeichnis um oder fügen Sie einen Symlink hinzu.Oder nicht
ash
für deine verwenden/bin/sh
. Andere einfache POSIX-Shell-Implementierungen, die dies nicht tun, umfassenyash
undmksh
.quelle
sh
verstößt gegen den POSIX-Standard. Angesichts der Tatsache, dass der Sinn einer separatensh
Shell genau darin besteht, dass Sie sicher sein sollten, nicht über eine inkompatible Shell-Erweiterung zu stolpern (ich vermute, dass derzeit niemand sie/bin/sh
als Anmeldeshell verwendet ), würde ich das als Fehler betrachten.ash
von / bin / sh mehr darin besteht, den Leistungsverlust durch die Verwendung zu vermeiden. Daher ist diebash
Verwendung vonyash
odermksh
(oderposh
wenn Sie alle Erweiterungen ausschließen möchten) immer noch eine bessere Option als die Verwendung vonbash
. Man kann es auch als Eckfall ansehen. Normalerweise hätte niemand%
eine Pfadkomponente. Die meisten Shells haben Eckgehäuse, in denen sie nicht POSIX-konform sind.[
Befehl erforderlich ist, obwohl sich dieses Zeichen nicht im PFCS befindet.