Что на самом деле делает оператор «-» в Linux? - PullRequest
4 голосов
/ 12 марта 2012

Я вижу, что оператор - ведет себя по-разному с разными командами.

Например,

cd - 

cds к ​​предыдущему каталогу, тогда как

vim -

читает с stdin

Итак, я хочу знать, почему оператор - ведет себя здесь двумя разными способами. Может кто-нибудь указать мне подробную документацию по оператору -?

Ответы [ 4 ]

11 голосов
/ 12 марта 2012

Это не оператор, это аргумент. Когда вы пишете программу на C или C ++, она выглядит как argv[1] (когда это первый аргумент), и вы можете делать с ней все, что захотите.

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

Дополнительно: здесь ниже приводится выдержка из main.c vim, которая анализирует аргументы, начинающиеся с -: если нет дополнительного символа, активируется ввод STDIN.

    else if (argv[0][0] == '-' && !had_minmin)
    {
        want_argument = FALSE;
        c = argv[0][argv_idx++];
#ifdef VMS
        ...
#endif
        switch (c)
        {
        case NUL:       /* "vim -"  read from stdin */
                /* "ex -" silent mode */
        if (exmode_active)
            silent_mode = TRUE;
        else
        {
            if (parmp->edit_type != EDIT_NONE)
            mainerr(ME_TOO_MANY_ARGS, (char_u *)argv[0]);
            parmp->edit_type = EDIT_STDIN;
            read_cmd_fd = 2;    /* read from stderr instead of stdin */
        }
2 голосов
/ 12 марта 2012

Черта сама по себе является простым аргументом команды. Его значение зависит от команды. Два его наиболее обычных значения - это «стандартный ввод» или (реже) «стандартный вывод». Значение «предыдущий каталог» уникально для встроенной оболочки cd (и это означает, что в некоторых оболочках не во всех оболочках).

cat file1 - file2 | troff ...

Это означает чтение file1, стандартный ввод и file2 в этой последовательности и отправка вывода на troff.

Крайний случай использования - для обозначения «стандартный ввод» или «стандартный вывод» происходит из (GNU) tar:

generate_file_list ... |
tar -cf - -T - |
( cd /some/where/else; tar -xf - )

Параметры -cf - в первом tar означают «создать архив» и «выходной файл - стандартный вывод»; опция -T - означает «читать список файлов и / или каталогов из стандартного ввода».

Опции -xf - во втором tar означают «извлечь архив» и «входной файл является стандартным вводом». Фактически, GNU tar имеет опцию -C /some/where/else, что означает, что она сама выполняет cd, поэтому вся команда может быть:

generate_file_list ... |
tar -cf - -T - |
tar -xf - -C /some/where/else

Чистый эффект этого - копирование файлов, названных командой generate_file_list, из «текущего каталога» в /some/where/else, сохраняя структуру каталогов. («Текущий каталог» должен быть взят с небольшим количеством соли; любые абсолютные имена файлов обрабатываются GNU tar - & mdash; он удаляет начальную косую черту & mdash; относительные имена берутся относительно текущего каталога .)

1 голос
/ 12 марта 2012

Это зависит от программы, в которой он используется. Это означает разные вещи для разных программ.

0 голосов
/ 12 марта 2012

Я думаю, что разные программы используют разные соглашения.manpages показывает, как интерпретирует каждая программа - здесь man bash

-
    At shell startup, set to the absolute pathname used to invoke the shell
    or shell script being executed as passed in the environment or argument list.
    Subsequently, expands to the last argument to the previous command, after expansion.
    Also set to the full pathname used to invoke each command executed and placed 
    in the environment exported to that command. When checking mail, this parameter
    holds the name of the mail file currently being checked. 

и man vim

 - The file to edit is read from stdin.  Commands are read from stderr, 
    which should be a tty.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...