it-swarm-ru.tech

Использование тире (-) вместо имени файла

Для команды, если используется - в качестве аргумента вместо имени файла будет означать STDIN или STDOUT.

  1. Но в этом примере он создает файл с именем -:

    echo hello > -
    

    Как я могу сделать - в этом примере означает STDOUT?

  2. И наоборот, как я могу сделать - означает файл с именем - в таких примерах, как:

    cat -
    
121
Tim

С помощью - в качестве имени файла означает stdin/stdout - соглашение, которое используют многие программы. Это не специальное свойство имени файла. Ядро не распознает - как особый, поэтому любые системные вызовы ссылаются на - в качестве имени файла будет использовать - буквально как имя файла.

С перенаправлением bash, - не распознается как специальное имя файла, поэтому bash будет использовать его как буквальное имя файла.

Когда cat видит строку - как имя файла, он обрабатывает его как синоним stdin. Чтобы обойти это, вам нужно изменить строку, которую cat видит таким образом, что она по-прежнему ссылается на файл с именем -. Обычный способ сделать это состоит в том, чтобы префикс имени файла с путем - ./-, или /home/Tim/-. Этот метод также используется для обхода подобных проблем, когда параметры командной строки конфликтуют с именами файлов, поэтому файл называется ./-e не отображается как -e опция командной строки для программы, например.

169
camh
  1. Вместо echo hello > -, ты можешь использовать echo hello > /dev/stdout.

    Хотя '-' - это соглашение, которое должно быть реализовано каждой программой, желающей его поддержать, /dev/stdin, /dev/stdout а также /dev/stderr, когда они поддерживаются ОС (по крайней мере, Solaris, Linux и BSD), не зависят от приложения и будут работать так, как вы задумали.

18
jlliagre

Как упомянутый camh , - это просто соглашение об именах, используемое некоторыми программами. Если вы хотите сослаться на эти потоки с помощью файлового дескриптора, который распознает Shell, jiliagre был прав если вы используете имя /dev/stdin или /dev/stdout вместо Эти имена файлов должны работать в любом месте, где будет работать нормальное имя файла.

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

    echo hello |
    
  2. Во втором примере вам просто нужно указать, что вам нужен литеральный файл с таким именем, а не его внутренний псевдоним. Вы можете сделать это проще всего, указав путь к файлу следующим образом:

    cat ./-
    
10
Caleb

Что касается 1, программа должна поддерживать его. Вы не можете просто использовать это произвольно. Что касается 2, перенаправить ввод с (например, cat < -).

6
bahamat

Подход "-" имеет много проблем. Прежде всего это требует интерпретации символа "-", и многие программы не выполняют такую ​​интерпретацию. И, кроме того, есть некоторые программы, которые интерпретируют дефис как разделитель, обозначающий конец параметров командной строки. Программы написаны для работы с аргументами имени файла, подход "-" - хак, хороший, но слабый.

Лучший способ это:

$ echo hello > /dev/fd/1

/dev/stdout является символической ссылкой /dev/fd/1

1
b3h3m0th

Специальные символы имеют в основном два значения:

Цифровой график ASCII.

Скриптинг или символический.

Возможно, что один символ представляет строку или действует как строка. как я понимаю.

в языке C fopen() функция принимает два аргумента: первый поток файла и второй режим, в котором файл будет открыт. режим является строкой. даже если это один символ.

кошка> "-" работает.

0
Owais Qureshi