Программа получает не совсем то, что ты набрал: $, * и кавычки Bash обрабатывает до запуска.
Прежде чем запустить команду, Bash готовит её аргументы — слова, которые получит программа. Пробел разделяет аргументы. $HOME Bash заменяет значением переменной — путём домашнего каталога. Шаблон имён *.log из урока о файлах Bash заменяет списком подходящих имён, и программа получает уже готовые имена. Кавычки меняют эту подготовку:
| Как записано | Что получит программа |
|---|---|
$HOME |
путь домашнего каталога |
"$HOME" |
тот же путь одним аргументом, даже с пробелами |
'$HOME' |
текст $HOME как есть |
*.log |
имена файлов, подходящих под шаблон |
'*.log' или "*.log" |
текст *.log как есть |
Увидеть аргументы помогает printf '%s\n': он печатает каждый аргумент на отдельной строке.
Посмотри, что получает printf
В каталоге ~/shell-lab выполни три вызова printf из списка и сравни, какие аргументы получила программа. Файлы не меняй.
Сначала предположи
Сколько строк напечатает первый вызов, printf '%s\n' *.log?
Теперь начни упражнение, выполни команду и сверь прогноз с выводом.
Что напечатает printf '%s\n' $HOME/my docs — без кавычек?
-
Без кавычек Bash подставляет значение
$HOME. Текстом$HOMEостаётся в одинарных кавычках:'$HOME'. -
Пробел без кавычек разделяет аргументы: printf получил два слова и напечатал каждое на своей строке. Одним аргументом путь станет в кавычках:
"$HOME/my docs". -
printf печатает аргументы и файлы не открывает, ему всё равно, есть ли такой путь. Проверь:
printf '%s\n' /no/such/dir.
Без кавычек Bash разделил путь по пробелу, и printf получил два аргумента: /home/student/my и docs.