Meu $ PATH fica assim:
/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
No bash, posso, sem problemas, chamar a varinha localizada em
/home/torbjorr/deployed/x86_64-GNU%2fLinux/wand
gostar
$ 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
No entanto, no modo de compatibilidade do shell bourne, o wand não pode ser encontrado:
$ wand
sh: 2: wand: not found
Parece que o problema é o sinal de% nesses caminhos. Este sinal foi adicionado pela codificação de URL para que o nome "GNU / Linux" possa ser usado no nome do diretório, mesmo que não seja um nome de arquivo válido. É possível obter o nome trabalhando em sh ou fazer o comando sh funcionar como bash. Ou seja, faça o bash se comportar da mesma maneira, mesmo que tenha sido chamado com o comando / bin / sh, que simboliza o bash de qualquer maneira.
sh
(é ok embash
ezsh
embora). Chamar diretamente o executável funcionash
; realmente estranho.Respostas:
Esse não é o shell Bourne, ou
bash
emular o shell Bourne, é o shell Almquist, no seu caso provavelmente o shell Debian Almquist (um fork Linux do Debian dos BSDs se baseia no shell Almquist original).No shell Almquist (o original e as versões modernas),
%
é usadoPATH
para recursos extras específicosash
. Citando a partir da documentação:Outros shells gostam
ksh
ouzsh
têm um mecanismo de carregamento automático de funções semelhante, mas usam uma variável diferente ($FPATH
), mas você não pode definir quais funções ou executáveis têm precedência.No seu caso,
/home/torbjorr/deployed/vector/x86_64-GNU%2fLinux
é interpretado como o/home/torbjorr/deployed/vector/x86_64-GNU
diretório com a2fLinux
bandeira. Essa bandeira é ignorada, pois é desconhecida.Não há jeito de contornar isso. Mesmo cinzas tinham um mecanismo de fuga para que esta
%
não ser tratado de forma especial, seria, então, não trabalho em outras conchas ou outras coisas que olhar para cima$PATH
comoexecvp()
.Você precisará remover os
%
caracteres$PATH
, renomeie seu diretório ou adicione um link simbólico.Ou não use
ash
para o seu/bin/sh
. Outras implementações leves de shell POSIX que não fazem isso incluemyash
emksh
.fonte
sh
viola o padrão POSIX. Dado que o ponto de separarsh
é exatamente que você deve ter certeza de não tropeçar em alguma extensão incompatível do shell (acho que ninguém usa/bin/sh
como shell de login atualmente), consideraria isso um bug.ash
para / bin / sh é mais para evitar a penalidade de desempenhobash
, portanto, usaryash
oumksh
(ouposh
se você deseja excluir todas as extensões) ainda é uma opção melhor do que usarbash
. Além disso, pode-se considerar um caso de canto. Normalmente, ninguém teria%
um componente de caminho. A maioria dos shells possui casos de canto em que não são compatíveis com POSIX.[
comando, mesmo que esse caractere não esteja no PFCS.