Включать сброс истории в ksh после каждой команды (или прекращать ее обновление)

Я использую:

hg addremove

для этого после того, как удалил какой-либо корень из извлеченного каталога (или после того, как добавил узоров в файл .hgignore ).
hg addremove -h говорит вам:

Add all new files and remove all missing files from the repository.

Mercurial жалуется на * в имени файла. Зарезервированный символ, который нельзя использовать в именах файлов Windows. Однако само сообщение поступает на stderr и не должно влиять на работу труб.

Альтернативой является использование

hg remove --after

, которое помечает файлы, которые удалены, но комментирует все файлы (те, которые еще есть, а также те, которые удалены) и, похоже, не реагирует на опцию -quiet .

-121--290950-

Когда xargs видит \!\(\* -4.pdf , он понимает ! (* -4.pdf . При использовании xargs необходимо создать входные данные, соответствующие его синтаксису ввода, который не похож ни на что другое. Простое добавление обратной косой черты перед местами позволяет справиться только с местами.

В Linux, * BSD и OSX, xargs поддерживает параметр -0 , который говорит ему действовать с записями, разделенными нулевыми байтами без кавычек. hg status -0 создает записи, разделенные нулевыми байтами. Остается обработать промежуточную обработку, чтобы справиться с нулями вместо новых линий в качестве сепараторов.

С GNU awk или любым другим awk, который поддерживает нулевые байты в качестве разделителей записей (я думаю, что BSD/OSX awk), вы можете переключить преобразование в awk.

hg status -0 |
awk -v RS='\0' -v ORS='\0' '/^!/ {print substr($0, 3)}' |
xargs -0 hg remove
-121--290951-

Я думаю, что у меня есть гораздо более простое решение, но я не уверен, насколько оно портативно. Рассмотрим:

$ cat trunc.c
#include <stdio.h>

int main() {
    int c;
    while(((c = getchar()) != EOF) && ((c & 0xff) != 0xff))
        putchar(c);
    return 0; 
}

Это использует тот факт, что на машине с двумя дополнениями (-1 & 0xff) = = 0xff . Это захватывает вашу программу, которая печатает EOF как символ. Я проверил его:

your_buggy_source_gen < any_ascii_file | trunc

, что эквивалентно cat any_ascii_file, при условии, что в нем нет октетов значения 0xff.

1
30.05.2018, 20:34
1 ответ

Solía ​​tener varios shells ejecutándose en screen. En mi.khsrc, personalizaría varias configuraciones, incluidas $PS1 y $HISTFILE (e incluiría el nombre base del dispositivo tty ).

Esto fue relativamente fácil de reconstruir:

tty=$(basename $(tty))
histdir=~/.hist
mkdir -p $histdir
export HISTFILE=$histdir/history.$tty
export PS1=$USER@'$PWD ['$tty'] ${?#0}$ '
exec /usr/bin/ksh

Guarde esto como ~/bin/screenshelly ejecute chmod +x ~/bin/screenshell. Ahora puede ejecutar screeny tener archivos de historial separados para cada ventana.

SHELL=~/bin/screenshell screen

Ejemplos:

Ventana 3

    vagrant@/home/vagrant [3] 127$ history
    1       history
    2       error
    3       history

Ventana 4

    vagrant@/home/vagrant [4] $ history
    1       history
    vagrant@/home/vagrant [4] $ echo $HISTFILE
    /home/vagrant/.hist/history.4
    vagrant@/home/vagrant [4] $ tty
    /dev/pts/4

Una alternativa sería ejecutar exec kshdesde .kshrc, pero necesitará algún tipo de prueba para evitar un bucle exec -.

0
28.01.2020, 00:34

Теги

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