Все является файлом?

В ударе можно создать массив, но вложенные структуры данных не поддерживаются. Поэтому необходимо взломать что-то сами. Например, можно использовать разделитель:

#! /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
4
26.08.2015, 23:18
3 ответа

Фраза « Все есть файл » определяет архитектуру операционной системы. Это означает, что все в системе - от процессов, файлов, каталогов, сокетов, каналов и т. Д. - представлено файловым дескриптором, абстрагированным на уровне виртуальной файловой системы в ядре. Виртуальная файловая система - это интерфейс, предоставляемый ядром. Поэтому фраза была исправлена ​​на " Все является файловым дескриптором ". Сам Линус Торвальдс еще раз поправил его немного точнее: « Все является потоком байтов ».

Однако у каждого «файла» также есть владелец и разрешения, о которых вы можете узнать из обычных файлов и каталогов. Поэтому классические инструменты 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 .

28
27.01.2020, 20:44

Ваша оболочка достаточно умен, чтобы знать, что cd не будет работать с параметрами файла. Поэтому, когда вы нажимаете вкладку , в этом каталоге отображаются только те элементы, которые будут работать с cd .

6
27.01.2020, 20:44
  1. cd встроен в bash . Завершение TAB контролируется параметрами bash, вы можете найти различные сценарии завершения в / usr / share / bash-completion / bash_completion и /etc/bash_completion.d ]. Метод завершения cd определен в предыдущем. Поскольку cd работает только с каталогом, естественно перечислить только доступный каталог.

  2. В Linux все файлы.

1
27.01.2020, 20:44

Теги

Похожие вопросы