Mi $ PATH se ve así:
/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, puedo sin problema invocar la varita ubicada en
/home/torbjorr/deployed/x86_64-GNU%2fLinux/wand
me gusta
$ 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
Sin embargo, en el modo de compatibilidad de bourne shell, no se puede encontrar la varita:
$ wand
sh: 2: wand: not found
Parece que el problema es el signo% en estas rutas. Este signo se ha agregado mediante codificación de URL para que el nombre "GNU / Linux" se pueda usar en el nombre del directorio aunque no sea un nombre de archivo válido. ¿Es posible hacer que el nombre funcione en sh, o hacer que el comando sh funcione como bash? Es decir, hacer que bash se comporte igual a pesar de que se invocó con el comando / bin / sh, que de todos modos se vincula a bash.
sh
(está bien enbash
yzsh
aunque). Llamar directamente al ejecutable funciona ensh
; muy extraño.Respuestas:
Ese no es el shell Bourne, o
bash
emular el shell Bourne, es el shell Almquist, en su caso, probablemente, el shell Debian Almquist (una bifurcación Linux de Debian de la propia BSD basada en el shell Almquist original).En el shell Almquist (el original y las versiones modernas),
%
se utilizaPATH
para funciones adicionales específicas paraash
. Citando de la documentación:A otros shells les gusta
ksh
ozsh
tienen un mecanismo similar de carga automática de funciones, pero usan una variable diferente ($FPATH
), pero no puedes definir qué funciones o ejecutables tienen prioridad.En su caso,
/home/torbjorr/deployed/vector/x86_64-GNU%2fLinux
se interpreta como el/home/torbjorr/deployed/vector/x86_64-GNU
directorio con la2fLinux
bandera. Esa bandera se ignora ya que se desconoce.No hay forma de evitar eso. Incluso si la ceniza tenía un mecanismo de escape para que esta
%
no se trata de forma especial, que sería entonces no funciona en otros proyectiles u otras cosas que mirar hacia arriba$PATH
comoexecvp()
.Tendrá que eliminar los
%
caracteres$PATH
, así que cambie el nombre de su directorio o agregue un enlace simbólico.O no lo uses
ash
para tu/bin/sh
. Otras implementaciones ligeras de shell POSIX que no hacen eso incluyenyash
ymksh
.fuente
sh
viola el estándar POSIX. Dado que el punto de tener un separadosh
es exactamente que debes asegurarte de no tropezar con alguna extensión de shell incompatible (supongo que nadie usa/bin/sh
como shell de inicio de sesión en estos días), lo consideraría un error.ash
for / bin / sh es más para evitar la penalización de rendimiento del usobash
, por lo que usaryash
omksh
(oposh
si desea excluir todas las extensiones) sigue siendo una mejor opción que usarbash
. Además, uno puede considerarlo un caso de esquina. Nadie normalmente tendría%
un componente de ruta. La mayoría de los depósitos tienen esquinas en las que no cumplen con POSIX.[
comando aunque ese carácter no esté en el PFCS.