В ударе можно создать массив, но вложенные структуры данных не поддерживаются. Поэтому необходимо взломать что-то сами. Например, можно использовать разделитель:
#! /bin/bash
for tuple in user1#pass1 user2#ls\;ls user3#pass#3 ; do
user=${tuple%%#*}
password=${tuple#*#}
echo User $user
echo Password $password
done
Просто удостоверьтесь, что первое значение никогда не содержит разделитель.
Или, использовать set
с плоским списком и shift
правильное число членов в каждом повторении:
#! /bin/bash
set -- user1 pass1 user2 ls\;ls user3 pass#3
while (( $# )) ; do
user=$1
password=$2
shift 2
echo User $user
echo Password $password
done
Фраза « Все есть файл » определяет архитектуру операционной системы. Это означает, что все в системе - от процессов, файлов, каталогов, сокетов, каналов и т. Д. - представлено файловым дескриптором, абстрагированным на уровне виртуальной файловой системы в ядре. Виртуальная файловая система - это интерфейс, предоставляемый ядром. Поэтому фраза была исправлена на " Все является файловым дескриптором ". Сам Линус Торвальдс еще раз поправил его немного точнее: « Все является потоком байтов ».
Однако у каждого «файла» также есть владелец и разрешения, о которых вы можете узнать из обычных файлов и каталогов. Поэтому классические инструменты Unix, такие как cat, ls, ps, ... могут запрашивать все эти «файлы», и нет необходимости изобретать другие специальные механизмы, кроме простых старых инструментов, которые все используют read ()
системный вызов. Например, в семействе ОС Microsoft есть несколько различных системных вызовов read ()
(я слышал около 15) для любых типов файлов, и каждый из них немного отличается. Когда все в виде файла, это вам не нужно.
На ваш вопрос : Конечно, существуют разные типы файлов . В Linux существует 7 типов файлов . Каталог - один из них. Но утилиты могут отличить их друг от друга. Например, полная функция команды cd
(при нажатии TAB ) перечисляет только каталоги, поскольку системный вызов stat ()
(см. man 2 stat
) возвращает структуру с полем с именем st_mode
. Стандарт POSIX определяет, что может содержать это поле:
S_ISREG(m) is it a regular file?
S_ISDIR(m) directory?
S_ISCHR(m) character device?
S_ISBLK(m) block device?
S_ISFIFO(m) FIFO (named pipe)?
S_ISLNK(m) symbolic link? (Not in POSIX.1-1996.)
S_ISSOCK(m) socket? (Not in POSIX.1-1996.)
Функция завершения команды cd
просто отображает «файлы», в которых установлен флаг S_ISDIR
.
Ваша оболочка достаточно умен, чтобы знать, что cd
не будет работать с параметрами файла. Поэтому, когда вы нажимаете вкладку
, в этом каталоге отображаются только те элементы, которые будут работать с cd
.
cd
встроен в bash
. Завершение TAB
контролируется параметрами bash, вы можете найти различные сценарии завершения в / usr / share / bash-completion / bash_completion
и /etc/bash_completion.d
]. Метод завершения cd
определен в предыдущем. Поскольку cd
работает только с каталогом, естественно перечислить только доступный каталог.
В Linux все файлы.