Porcentagem na variável de ambiente $ PATH

16

Meu $ PATH é 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 problema invocar varinha localizada em

/home/torbjorr/deployed/x86_64-GNU%2fLinux/wand

como

$ 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 do bourne, a varinha não pode ser encontrada:

$ wand
sh: 2: wand: not found

Parece que o problema é o sinal% 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. Isto é, faça o bash se comportar da mesma maneira, mesmo que ele tenha sido invocado com o comando / bin / sh, que symlinks para bash de qualquer maneira.

    
por user877329 28.04.2014 / 20:06

1 resposta

16

Esse não é o shell Bourne, ou bash emulando o shell Bourne, que é o shell Almquist, no seu caso provavelmente o shell do Debian Almquist (um fork do Linux pelo próprio BSDs baseado no shell original do Almquist).

No shell Almquist (o original e as versões modernas), % é usado em PATH para recursos extras específicos para ash . Citando a documentação:

Path Search

When locating a command, the shell first looks to see if it has a shell function by that name. Then, if PATH does not contain an entry for %builtin, it looks for a builtin command by that name. Finally, it searches each entry in PATH in turn for the command.

The value of the PATH variable should be a series of entries separated by colons. Each entry consists of a directory name, or a directory name followed by a flag beginning with a percent sign. The current directory should be indicated by an empty directory name. If no percent sign is present, then the entry causes the shell to search for the command in the specified directory. If the flag is %builtin then the list of shell builtin commands is searched. If the flag is %func then the directory is searched for a file which is read as input to the shell. This file should define a function whose name is the name of the command being searched for.

Command names containing a slash are simply executed without performing any of the above searches.

Outros shells como ksh ou zsh têm um mecanismo de carregamento automático de funções similar, 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 diretório /home/torbjorr/deployed/vector/x86_64-GNU com o sinalizador 2fLinux . Esse sinalizador é ignorado, pois é desconhecido.

Não há maneira de contornar isso. Mesmo que as cinzas tivessem um mecanismo de escape para que este % não fosse tratado especialmente, ele não funcionaria em outros shells ou outras coisas que procurassem $PATH como execvp() .

Você precisará remover os caracteres % de $PATH , para renomear seu diretório ou adicionar um link simbólico.

Ou não use ash para seu /bin/sh . Outras implementações de shell POSIX leves que não fazem isso incluem yash e mksh .

    
por 28.04.2014 / 22:46