2015-08-06 2 views
0

Я не отличный скрипт bash и, следовательно, задаю несколько вопросов. Один из них - как (или даже независимо) bash понимает, что переменная является «файлом» или просто локальной переменной.Как определить, является ли переменная файлом в bash?

file=/usr/share/lib 

Очевидно, что это файл, который будет сохранен, и т.д., и может быть использован как так:

echo "$output" > $file 

Чтобы сохранить результат $output в $file.

Но где в bash он подсчитывает, является ли это файлом или нет, является ли он только файлом, когда он был передан «методу записи»?

+0

Я не искал тест на то, является ли это файлом или нет. Я искал объяснение, когда, почему и как он становится файлом. – insidesin

ответ

2

Если вы рассматриваете эту переменную как имя файла, bash будет просто делать то, что сказано, например.

echo "Test output" > $file 

будет работать независимо от того файла, который установлен в /tmp/myfile.txt или abcd. В приведенном выше примере вы используете bash's file redirection, чтобы выписать стандарт на файл, который вы назвали.

Следовательно, если вы используете неправильную переменную в приведенном выше шаблоне или неправильно задали значение, bash будет просто следовать вашим инструкциям, и вы можете оказаться в неправильных и/или локальных файлах.

+0

Итак, с помощью '>' 'и' '' '' 'являются файловые операции? Можно ли использовать операцию, предназначенную для использования в переменных, а затем - операцию с файлом? – insidesin

+1

> и <нет * труба *, хотя есть некоторое отношение. > и <- операции перенаправления.См. Документ, связанный выше –

+0

А, спасибо. Можно ли считать '|' безопасным соединение с командами/выводами трубопроводов? – insidesin

2

Вам нужно проверить это самостоятельно, bash знает только содержимое переменной. Если вы хотите проверить, если местоположение файла проводится в переменной, вы можете проверить его с помощью -ftest operator

if [ -f "$file" ] 
then 
    echo "$file is a file" 
    echo "$output" > "$file" 
else 
    echo "$file is not a file" 
fi 
0

Переменные строки - ни больше, ни меньше. (Я игнорирую здесь переменные массива, WLOG).

Bash (или любая оболочка) вслепую изменяет переменные, не учитывая, что вы намереваетесь делать с ними. Только на следующем этапе обработки команд содержимое строки имеет значение.

Чтобы использовать пример:

output="foo bar" 
file=/usr/share/lib 
echo "$output" >"$file" 

(я цитировал $file, даже если в этом нет необходимости здесь, просто потому, что я был укушен слишком много раз, изменив значение и разбивая все).

Линия

echo "$output" >"$file" 

преобразуется в

echo "foo bar" >"/usr/share/lib" 

и только тогда Баш рассмотреть > и попытаться открыть /usr/share/lib для записи.

Смежные вопросы