Mon $ PATH ressemble à ceci:
/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
En bash, je peux sans problème invoquer la baguette située dans
/home/torbjorr/deployed/x86_64-GNU%2fLinux/wand
comme
$ 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
Cependant, en mode de compatibilité shell bourne, la baguette est introuvable:
$ wand
sh: 2: wand: not found
Il semble que le problème soit le signe% dans ces chemins. Ce signe a été ajouté par codage URL afin que le nom "GNU / Linux" puisse être utilisé dans le nom du répertoire même s'il ne s'agit pas d'un nom de fichier valide. Est-il possible de faire fonctionner le nom dans sh, ou de faire fonctionner la commande sh comme bash. C'est-à-dire, faire en sorte que bash se comporte de la même manière, même s'il a été invoqué avec la commande / bin / sh, qui crée quand même un lien symbolique avec bash.
sh
(il est correct dansbash
etzsh
cependant). L'appel direct de l'exécutable fonctionne danssh
; vraiment étrange.Réponses:
Ce n'est pas le shell Bourne, ou
bash
émuler le shell Bourne, c'est le shell Almquist, dans votre cas probablement le shell Debian Almquist (un fork Linux par Debian de BSDs sh lui-même basé sur le shell Almquist original).Dans la coque Almquist (l'original et les versions modernes),
%
est utiliséPATH
pour des fonctionnalités supplémentaires spécifiques àash
. Citant de la documentation:D'autres shells aiment
ksh
ouzsh
ont un mécanisme de chargement automatique des fonctions similaire, mais ils utilisent une variable différente ($FPATH
), mais vous ne pouvez pas définir lesquelles des fonctions ou des exécutables ont la priorité.Dans votre cas,
/home/torbjorr/deployed/vector/x86_64-GNU%2fLinux
est interprété comme le/home/torbjorr/deployed/vector/x86_64-GNU
répertoire avec le2fLinux
drapeau. Ce drapeau est ignoré car il est inconnu.Il n'y a pas de chemin aux alentours. Même si les cendres avait un mécanisme d'échappement pour que ce
%
ne soit pas traité spécialement, il travaillerait alors pas dans d' autres coquilles ou d' autres choses qui admirent$PATH
commeexecvp()
.Vous devrez supprimer les
%
caractères de$PATH
, alors renommez votre répertoire ou ajoutez un lien symbolique.Ou ne l'utilisez pas
ash
pour votre/bin/sh
. D'autres implémentations de shell POSIX légères qui ne font pas cela incluentyash
etmksh
.la source
sh
viole le standard POSIX. Étant donné que le point d'avoir un séparésh
est exactement que vous devriez être sûr de ne pas trébucher sur une extension de shell incompatible (je suppose que personne n'utilise/bin/sh
comme shell de connexion ces jours-ci), je considérerais cela comme un bug.ash
de / bin / sh soit plus pour éviter la pénalité de performance de l'utilisationbash
, donc l'utilisation deyash
oumksh
(ouposh
si vous souhaitez exclure toutes les extensions) est toujours une meilleure option que l'utilisationbash
. En outre, on peut le considérer comme un cas d'angle. Personne n'aurait normalement%
dans un composant de chemin d'accès. La plupart des coques ont des boîtiers d'angle où ils ne sont pas conformes à POSIX.[
commande même si ce caractère n'est pas dans le PFCS.