2011-02-01 11 views

Respuesta

16

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.

+0

Respuesta perfecta. ¡Gracias! – eatloaf

+0

@eatload - gald para poder ayudar - el 'shell-command' de R. P. Dillon parece una buena alternativa también. –

11

Dependiendo de su caso de uso, si desea ejecutar comandos de shell y tener la salida disponible en un nuevo búfer con frecuencia, también puede hacer uso de la función shell-command. En su ejemplo, se vería algo como esto:

(shell-command "ls -t ~/org *.txt | head -5") 

tener esta inserta en el búfer en uso, sin embargo, sería necesario que se establece current-prefix-arg manualmente usando algo como (universal-argument), que es un poco de un truco. Por otro lado, si solo quiere la salida en algún lugar, puede obtenerla y procesarla, shell-command funcionará tan bien como cualquier otra cosa.

+1

No creo que deba establecer 'current-prefix-arg' manualmente. 'shell-command' toma dos parámetros opcionales' output-buffer' y 'error-buffer'. –

+0

Vi eso, pero noté que si especificabas 'output-buffer' para que fuera el búfer actual, dice que borra primero el búfer y luego inserta el resultado del comando, lo que a menudo sería indeseable, creo. No lo he probado, así que no puedo decirlo con certeza. –

+0

Si desea salida en el búfer actual, puede usar un argumento que no sea ni un búfer ni nulo para 'output-buffer'.Luego se insertará la salida en lugar de reemplazar el contenido actual. P.ej. '(shell-command" ls "t)' –

Cuestiones relacionadas