2011-02-01 4 views

risposta

16

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.

+0

Risposta perfetta. Grazie! – eatloaf

+0

@eatload - gald per essere in grado di aiutare - il 'shell-command' di R.P. Dillon sembra anche una buona alternativa. –

11

A seconda del caso d'uso, se si desidera eseguire i comandi della shell e avere l'output reso disponibile in un nuovo buffer frequentemente, è possibile utilizzare anche la funzione shell-command. Nel tuo esempio, sarebbe simile a questa:

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

di avere questo inserito nel buffer corrente, tuttavia, richiederebbe di impostare manualmente current-prefix-arg usando qualcosa come (universal-argument), che è un po 'di hack. D'altra parte, se si desidera che l'output sia in qualche posto, è possibile ottenerlo ed elaborarlo, shell-command funzionerà come qualsiasi altra cosa.

+1

Non penso che sia necessario impostare 'current-prefix-arg' manualmente. 'shell-command' prende due parametri opzionali' output-buffer' e 'error-buffer'. –

+0

L'ho visto, ma ho notato che se si specifica "buffer di output" come buffer corrente, si dice che cancella prima il buffer e poi inserisce il risultato del comando, che sarebbe spesso indesiderabile, penso. Non l'ho provato, quindi non posso dirlo con certezza. –

+0

Se si desidera l'output nel buffer corrente, è possibile utilizzare un argomento che non è nè un buffer nil per 'output-buffer'.Quindi l'output verrà inserito anziché sostituire il contenuto corrente. Per esempio. '(shell-command" ls "t)' –

Problemi correlati