Проблема в том, что токены, такие как ~
, *
и |
, не обрабатываются / не расширяются программой ls
.Поскольку токены не обрабатываются, ls
ищет файл или каталог, буквально называемый ~/org
, файл или каталог, буквально называемый *.txt
, и файл или каталог, буквально называемый | head -5
.Таким образом, вы получили сообщение об ошибке «Нет такого файла или каталога».
Эти токены обрабатываются / расширяются оболочкой (например, Bourne shell / bin / sh или Bash / bin / bash). Технически, интерпретациятокены могут быть специфичными для оболочки, но большинство оболочек интерпретируют, по крайней мере, некоторые из одинаковых стандартных токенов одинаково, например, |
означает соединение программ друг с другом сквозным образом почти со всеми оболочками. В качестве контрпримера, оболочка Борна (/bin / sh) не выполняет расширение ~
tilde / home-directory.
Если вы хотите получить расширения, вы должны заставить свою вызывающую программу выполнить само расширение как оболочку (тяжелая работа) или выполните команду ls
в оболочке (гораздо проще):
/bin/bash -c "ls -t ~/org *.txt | head -5"
, поэтому
(call-process "/bin/bash" nil t nil "-c" "ls -t ~/org *.txt | head -5")
Edit: Уточнены некоторые проблемы, например, упомянуто, что/bin/sh
не делает ~
расширение.