0 votes

Bug ? 'bel après-midi' désactive la recherche de $PATH

Avec ~/bin au début de mon $PATH, je dois quand même nommer le répertoire si je mets 'nice time' devant le nom du fichier. De plus, 'which' ne le trouve pas encore, mais il s'exécute toujours si je l'invoque sans 'nice time bin/'. Ce n'était pas le cas il n'y a pas longtemps. S'agit-il d'un bug introduit récemment, ou d'une "fonctionnalité" qu'Apple n'a pas supportée jusqu'à récemment ?

MBP:~ user$ nice time copy_websites
copy_websites: Aucun fichier ou dossier de ce type
        0.00 réel         0.00 utilisateur         0.00 système
MBP:~ user$ echo $PATH
~/bin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/opt/X11/bin:/Applications/Server.app/Contents/ServerRoot/usr/bin:/Applications/Server.app/Contents/ServerRoot/usr/sbin
MBP:~ user$ which copy_websites
MBP:~ user$ which bash
/bin/bash
MBP:~ user$ head -1 bin/copy_websites 
#!/bin/bash
MBP:~ user$ ls -lat@e bin/co*
-rwx------@ 1 user  staff  747 Mar 10 13:36 bin/copy_websites
    com.apple.TextEncoding   15 
    com.apple.metadata:kMDLabel_zla7g6mgqwkmgzlaez4j64ql5q   89

0voto

nohillside Points 82672

Le problème ici est que la manipulation de ~ diffère entre le shell et le noyau macOS. Si vous exécutez votre commande directement depuis l'invite, l'expansion de PATH est gérée par le shell qui sait comment étendre ~. Si vous exécutez votre commande via nice, la commande est transmise au noyau macOS pour l'expansion du chemin :

pse@Mithos:~$ mkdir foo
pse@Mithos:~$ cat >foo/foo.sh
#!/bin/sh
echo foo ici
pse@Mithos:~$ chmod +x foo/foo.sh
pse@Mithos:~$ foo/foo.sh
foo ici
pse@Mithos:~$ PATH='~/foo':$PATH
pse@Mithos:~$ echo $PATH
~/foo:/Users/pse/.bin/script:/Users/pse/.bin/i386:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/Library/TeX/texbin
pse@Mithos:~$ foo.sh
foo ici
pse@Mithos:~$ time foo.sh
foo ici

real    0m0.007s
user    0m0.002s
sys 0m0.002s
pse@Mithos:~$ nice time foo.sh
foo.sh: Aucun fichier ou dossier de ce type
        0.00 réel         0.00 utilisateur         0.00 système
pse@Mithos:~$ nice foo.sh
nice: foo.sh: Aucun fichier ou dossier de ce type
pse@Mithos:~$ 

Pour éviter cela, assurez-vous toujours que votre PATH assigné ne contient ni ~ ni aucune variable non étendue.

PS : De plus, il existe différentes commandes time appelées pour time foo et nice time foo. Pour obtenir le même format de sortie dans les deux cas, utilisez /usr/bin/time foo à la place.

LesApples.com

LesApples est une communauté de Apple où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres utilisateurs d'appareils Apple, poser vos propres questions ou résoudre celles des autres.

Powered by:

X