# по числу переменных, первая строка файла была разбита на подстроки,
# разделенные пробелами, которые и были записаны в переменные.
# 3) В последнюю переменную была записана вся оставшаяся часть строки.
# 4) Если команде "read" будет передано большее число переменных, чем подстрок
# в первой строке файла, то последние переменные останутся "пустыми".
echo "------------------------------------------------"
# Эта проблема легко разрешается с помощью цикла:
# Спасибо Heiner Steven за разъяснения.
echo "------------------------------------------------"
# Разбор строки, разделенной на поля
# Для задания разделителя полей, используется переменная $IFS,
echo "Список всех пользователей:"
OIFS=$IFS; IFS=: # В файле /etc/passwd, в качестве разделителя полей
# используется символ ":" .
while read name passwd uid gid fullname ignore
IFS=$OIFS # Восстановление предыдущего состояния переменной $IFS.
# Эту часть кода написал Heiner Steven.
# Если переменная $IFS устанавливается внутри цикла,
#+ то отпадает необходимость сохранения ее первоначального значения
#+ во временной переменной.
# Спасибо Dim Segebart за разъяснения.
echo "------------------------------------------------"
echo "Список всех пользователей:"
while IFS=: read name passwd uid gid fullname ignore
echo "Значение переменной \$IFS осталось прежним: $IFS"
Передача информации, выводимой командой echo, по конвейеру команде read, будет вызывать ошибку.
Тем не менее, передача данных по конвейеру от cat, кажется срабатывает.
Уже знакомая нам команда cd, изменяющая текущий каталог, может быть использована в случаях, когда некоторую команду необходимо запустить только находясь в определенном каталоге.
(cd /source/directory && tar cf - . ) | (cd /dest/directory && tar xpvf -)
[взято из упоминавшегося ранее примера]
Команда cd с ключом -P (physical) игнорирует символические ссылки.
Команда "cd -" выполняет переход в каталог $OLDPWD -- предыдущий рабочий каталог.
Неожиданным образом выполняется команда cd, если ей передать, в качестве каталога назначения, два слэша.
Само собой разумеется, это должен был бы быть каталог /. Эта проблема наблюдается как в командной строке, так и в сценариях.
Выводит название текущего рабочего каталога (Print Working Directory) (см. Пример 11-7). Кроме того, имя текущего каталога хранится во внутренней переменной $PWD.
Этот набор команд является составной частью механизма "закладок" на каталоги и позволяет перемещаться по каталогам вперед и назад в заданном порядке. Для хранения имен каталогов используется стек (LIFO -- "последний вошел, первый вышел").
pushd dir-name -- помещает имя текущего каталога в стек и осуществляет переход в каталог dir-name.
popd -- выталкивает, находящееся на вершине стека, имя каталога и одновременно осуществляет переход в каталог, оказавшийся на врешине стека.
dirs -- выводит содержимое стека каталогов (сравните с переменной $DIRSTACK). В случае успеха, обе команды -- pushd и popd автоматически вызывают dirs.