2012-05-04 1 views
4

Каков самый элегантный способ использования переменной оболочки (BASH), которая содержит символы, зарезервированные для globbing (завершение имени файла), которые вызывают некоторые нежелательные замены? Вот пример:Предотвращение подстановок после переменной подстановки

for file in $(cat files); do 
    command1 < "$file" 
    echo "$file" 
done 

Имена файлов содержат символы типа '[' или ']'. У меня в основном две идеи:

1) Выключить подстановка с помощью набора -f: мне нужен где-то еще

2) Побег имена файлов в файлах: BASH сетует «файл не найден» конвейеру на стандартный ввод

Thx для любого предложения

Edit: единственный ответ отсутствует, как читать из файла с именем, содержащим специальные символы, используемые для универсализации, когда имя файла в переменной оболочки «$ файла», е. г. command1 < "$ file".

ответ

1

Использовать вместо while read.

cat files | while read file; do 
    command1 < "$file" 
    echo "$file" 
done 
+0

Это хороший подскажите, спасибо. Это предотвратит перетаскивание в строках списка цикла for. Но две строки выполнения по-прежнему будут запускать глобус после замены переменных. – fungs

4

Вы можете отключить подстановку с set -f, а затем снова включите его в сценарии с set +f.

+0

Это, вероятно, работает, но если вам нужно отключить и активировать функцию глобирования в каждом цикле цикла, это не очень элегантно. – fungs

8

В качестве альтернативы переключения между set -f и set +f вы могли бы, возможно, просто применить один set -f подоболочки с окружающей средой родительской оболочки не на пострадавших от этого вообще:

(
set -f 
for file in $(cat files); do 
    command1 < "$file" 
    echo "$file" 
done 
) 


# or even 

sh -f -c ' 
    for file in $(cat files); do 
     command1 < "$file" 
     echo "$file" 
    done 
'