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

Чтобы сделать это, необходимо будет добавить две строки к Вашему ~/.bashrc:

shopt -s histappend
PROMPT_COMMAND="history -a;history -c;history -r;$PROMPT_COMMAND"

От man bash:

Если опция оболочки histappend включена (см. описание shopt под SHELL ВСТРОЕННЫЕ КОМАНДЫ ниже), строки добавляются в файл истории, иначе файл истории перезаписывается.

113
22.07.2011, 11:42
6 ответов

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

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

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

165
27.01.2020, 19:29
  • 1
    Стоит добавить это /dev/stdin и /dev/stdout универсально доступны и может использоваться вместо - конвенция. –  jmtd 22.07.2011, 12:00
  • 2
    Также в cat случай, с помощью перенаправления вместо того, чтобы перечислить аргумент мог бы помочь: cat <-; однако, к смешиванию и подгонке это с конкатенацией больше чем одного файла за один раз. было бы трудно –  jmtd 22.07.2011, 12:02
  • 3
    @jmtd:/dev/std {в} не универсально доступны. Не все unixes имеют его. –  camh 22.07.2011, 13:37
  • 4
    Интересный, я предположил, что они были частью POSIX (но не может подтвердить). Они присутствуют, по крайней мере, на Linux, BSDs и Солярисе. Можно ли дать пример современного UNIX, который испытывает недостаток в них? –  jmtd 02.08.2011, 11:51
  • 5
    @camh, Не уверенный, если Вы получили уведомление, и это очень, очень старая тема; я не уверен, можете ли Вы, но мне очень любопытно, если Вы знаете ответ на jmtdвопрос? :) –  Swivel 23.11.2016, 08:29
  1. Вместо echo hello > -, можно использовать echo hello > /dev/stdout.

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

17
27.01.2020, 19:29

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

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

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

    cat ./-
    
10
27.01.2020, 19:29

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

6
27.01.2020, 19:29

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

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

$ echo hello > /dev/fd/1

/ dev / stdout - это символическая ссылка на / dev / fd / 1

1
27.01.2020, 19:29

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

ASCII numeric chart.

Scripting or symbolic.

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

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

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

0
04.04.2020, 09:31

Теги

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