Я попробовал открыть файлы с помощью vim, vim $(cat filelist)
как было предложено ранеевопрос.
Предположим, у меня есть следующий файл:
~/Workspace/bar/foo.cpp
Выполнение vim $(cat filelist)
из ~/Workspace
правильно открывает, foo.cpp
когда filelist
содержит bar/foo.cpp
. Однако команда не открывает файл, когда filelist
содержит ~/Workspace/bar/foo.cpp
. Я хочу знать, почему использование абсолютного пути приводит к сбою команды.
решение1
Это связано с порядком, в котором различные типы расширений выполняются в оболочке. На bash
странице руководства говорится:
Расширение выполняется в командной строке после ее разделения на слова. Существует семь видов выполняемого расширения: расширение фигурных скобок, расширение тильды, расширение параметров и переменных, подстановка команд, арифметическое расширение, разделение слов и расширение имени пути.
Замена ~
расширения тильды is, в то время как ваша $(...)
подстановка команды is. Теперь вы видите, что после выполнения подстановки команды больше нет подстановки тильды. С реальными абсолютными путями (начиная с корня файловой системы /
) это сработает.
Но вы можете выполнить расширение самостоятельно с помощью sed
:
vim $(sed "s_~_${HOME}_g" filelist)