El problema es que los tokens como ~
, *
y |
no son procesados / expandido en el programa ls
. Como los tokens no se procesan, ls
busca un archivo o directorio llamado literalmente ~/org
, un archivo o directorio literalmente llamado *.txt
, y un archivo o directorio literalmente llamado | head -5
. Por lo tanto, el mensaje de error que recibió acerca de `No dicho archivo o directorio".
Esos tokens son procesados / expandidos por el shell (como Bourne shell/bin/sh o Bash/bin/bash). Técnicamente, la interpretación de los tokens puede ser específico de shell, pero la mayoría de shell interpreta al menos algunos de los mismos tokens estándar de la misma manera, por ejemplo, |
significa que se conectan programas de extremo a extremo a casi todos los shells. Como contraejemplo, shell Bourne (/ bin/sh) no hace ~
tilde/home-directory expansion
Si desea obtener las expansiones, tiene que hacer que su programa de llamadas haga la expansión como un shell (trabajo) o ejecute su comando ls
en un shell (mucho más fácil):
/bin/bash -c "ls -t ~/org *.txt | head -5"
por lo
(call-process "/bin/bash" nil t nil "-c" "ls -t ~/org *.txt | head -5")
Editar: aclarado algunas cuestiones, como /bin/sh
mencionar que no hace ~
expansión.
Respuesta perfecta. ¡Gracias! – eatloaf
@eatload - gald para poder ayudar - el 'shell-command' de R. P. Dillon parece una buena alternativa también. –