Il problema è che i token come ~
, *
e |
non vengono elaborati/espansi dal programma ls
. Poiché i token non vengono elaborati, ls
cerca un file o una directory letteralmente denominata ~/org
, un file o una directory chiamata letteralmente *.txt
e un file o una directory chiamata letteralmente | head -5
. Quindi il messaggio di errore che hai ricevuto su `Nessun file o directory."
Questi token vengono elaborati/espansi dalla shell (come Bourne shell/bin/sh o Bash/bin/bash). Tecnicamente, interpretazione dei token può essere specifico della shell, ma la maggior parte della shell interpreta almeno alcuni degli stessi token standard allo stesso modo, ad esempio |
significa che i programmi si collegano end-to-end a quasi tutte le shell. Come controesempio, shell Bourne (/ bin/sh) non fa ~
tilde/espansione casa-directory.
Se si desidera ottenere le espansioni, è necessario ottenere il vostro programma chiamante per fare l'espansione in sé come un guscio farebbe (duro lavoro) oppure eseguire il comando ls
in un shell (molto più semplice):
/bin/bash -c "ls -t ~/org *.txt | head -5"
così
(call-process "/bin/bash" nil t nil "-c" "ls -t ~/org *.txt | head -5")
Edit: chiarito alcune questioni, come ricordare che /bin/sh
non fa ~
espansione.
fonte
2011-02-01 04:57:00
Risposta perfetta. Grazie! – eatloaf
@eatload - gald per essere in grado di aiutare - il 'shell-command' di R.P. Dillon sembra anche una buona alternativa. –