Чтобы сделать это, необходимо будет добавить две строки к Вашему ~/.bashrc
:
shopt -s histappend
PROMPT_COMMAND="history -a;history -c;history -r;$PROMPT_COMMAND"
От man bash
:
Если опция оболочки histappend включена (см. описание shopt под SHELL ВСТРОЕННЫЕ КОМАНДЫ ниже), строки добавляются в файл истории, иначе файл истории перезаписывается.
Используя -
поскольку имя файла для значения stdin/stdout является конвенцией, которую использует много программ. Это не специальное свойство имени файла. Ядро не распознает -
как особенный так любые системные вызовы, относящиеся к -
поскольку имя файла будет использовать -
буквально как имя файла.
С перенаправлением удара, -
не распознан как специальное имя файла, таким образом, удар будет использовать это в качестве литерального имени файла.
Когда cat
видит строку -
как имя файла, это рассматривает его как синоним для stdin. Для обхождения этого необходимо изменить строку это cat
видит таким способом, которым это все еще относится к названному файлу -
. Обычный способ сделать это состоит в том, чтобы снабдить префиксом имя файла путь - ./-
, или /home/Tim/-
. Эта техника также используется для обхождения подобных проблем, где параметры командной строки сталкиваются с именами файлов, таким образом, файл, называемый как ./-e
не появляется как -e
параметр командной строки к программе, например.
Вместо echo hello > -
, можно использовать echo hello > /dev/stdout
.
В то время как '-' является конвенцией, которая должна быть реализована каждой программой, желающей поддерживать его, /dev/stdin
, /dev/stdout
и /dev/stderr
при поддержке ОС (по крайней мере, Солярис, Linux и BSDs делают), независимый от приложения, и затем будет работать, как Вы предназначаете.
Как camh упомянутый, -
просто соглашение о присвоении имен, используемое некоторыми программами. Если Вы захотите обратиться к этим потокам с дескриптором файла, то оболочка распознает, jiliagre был корректен в наличии, Вы используете имя /dev/stdin
или /dev/stdout
вместо этого. Те имена файлов должны работать любое место, нормальное имя файла работало бы.
Однако Ваш первый пример довольно глуп. Любой вывод, который был бы пойман оператором перенаправления для записи в файл, уже находится НА стандартном выводе, таким образом перенаправляя его и обратной записи его туда, где он прибыл из, бесполезно. Поведение, которое Вы используете, существует канал, не перенаправление:
echo hello |
В Вашем втором примере просто необходимо дать, может некоторый признак, что Вы хотите прибрежный файл того имени, не внутренний псевдоним, который это имеет. Можно сделать это самое легкое путем определения пути к файлу как это:
cat ./-
Что касается 1, программа должна поддерживать его. Вы не можете просто произвольно использовать его. Что касается 2, вход перенаправления от (например, cat < -
).
Подход «-» имеет много проблем. Прежде всего, это требует интерпретации символа «-», а многие программы не выполняют такую интерпретацию. Более того, существуют программы, которые интерпретируют дефис как разделитель, обозначающий конец параметров командной строки. Программы написаны для работы с аргументами имени файла, подход «-» - неплохой, но слабый прием.
Лучший способ:
$ echo hello > /dev/fd/1
/ dev / stdout
- это символическая ссылка на / dev / fd / 1
Специальные символы в основном имеют два значения:
ASCII numeric chart.
Scripting or symbolic.
Возможно, один символ представляет строку или действует как строка. как я понимаю.
в языке C функция fopen()
принимает два аргумента: первый файловый поток и второй режим, в котором файл будет открыт. режим является строкой. даже если это один символ.
кот > "-" работает.
/dev/stdin
и/dev/stdout
универсально доступны и может использоваться вместо-
конвенция. – jmtd 22.07.2011, 12:00cat
случай, с помощью перенаправления вместо того, чтобы перечислить аргумент мог бы помочь:cat <-
; однако, к смешиванию и подгонке это с конкатенацией больше чем одного файла за один раз. было бы трудно – jmtd 22.07.2011, 12:02jmtd
вопрос? :) – Swivel 23.11.2016, 08:29