Chtěl bych nakonfigurovat bash tak, aby spouštěl příkaz clear
pokaždé, když do terminálu napíšu nějaký příkaz (před provádění mého příkazu). Jak to mohu udělat?
Používám Debian Linux.
Komentáře
- Najdete toto vlákno užitečné.
- Jen jsem zvědavý: Jakou ' na to používáte? Kromě případů, kdy jsem ' m ladění programů se spoustou výstupu, obvykle chci uchovat co nejvíce na obrazovce, abych mi pomohl sledovat kontext I ' pracuji.
Odpověď
Bash má háček precommand . Něco takového.
preexec () { clear } preexec_invoke_exec () { [ -n "$COMP_LINE" ] && return # do nothing if completing [ "$BASH_COMMAND" = "$PROMPT_COMMAND" ] && return # don"t cause a preexec for $PROMPT_COMMAND local this_command=`history 1 | sed -e "s/^[ ]*[0-9]*[ ]*//g"`; # obtain the command from the history, removing the history number at the beginning preexec "$this_command" } trap "preexec_invoke_exec" DEBUG
Komentáře
- Gilles: Vložil jsem výše uvedené do terminálu konsole a výstup z každého příkazu, který jsem následně zadal, byl vymazán, než jsem to mohl přečíst. Chybí mi něco? Co se stane s tímto (a další odpovědí níže), pokud vyvolám víceřádkový bash skript kde více než jeden řádek (nebo jakýkoli jiný řádek než poslední) generuje inter vytváření výstupu?
- @Joe To by mělo vymazat obrazovku po stisknutí
Enter
před provedením příkazu. Funguje to takhle pro mě. Hák preexec je spuštěn pro každý interaktivní příkaz, nezáleží na tom, ' zda je příkaz vestavěný nebo externí nebo mnoho příkazů. - @ Joe, musíte přidat tento řádek níže, nedělejte nic, pokud je úplný
[ "$BASH_COMMAND" = "$PROMPT_COMMAND" ] && return;
problém je v tom, že PROMPT_COMMAND je spuštěn a také uvězněn po samotném příkazu; Také mi může někdo říct, proč jelocal this_command=`history 1 | sed -e "s/^[ ]*[0-9]*[ ]*//g"`;
tady? - @JamesAndino
history -1
vytiskne poslední příkazový řádek s číslo historie vpředu. Filtr sed odstraní číslo historie. - @JamesAndino Díky tomu to fungovalo (a já vidím, že Giles to přidal ke své odpovědi.)
odpověď
bind "RETURN: "\e[1~clear; \e[4~\n""
Poté pokaždé stisknete návrat namísto pouhého psaní \n
přesune se na začátek řádku, zadá text clear;
, poté se přesune na konec a zadá \n
jak se očekávalo.
Komentáře
- Nový řádek způsobí, že se výzva přesto vytiskne, takže vložením příkazu clear do výzvy se dosáhne stejné věci bez znečištění historie příkazů příkazy
clear
. - @ jw013 Rozdíl je v tom, že v mém případě
clear
se provede před tím, než příkaz a výstup příkazu nezmizí ' t. V případě, že se to však zobrazí, - Přeji si, aby existoval nějaký způsob, jak to provést, aniž byste museli upravovat samotný příkazový řádek – jsem si ' jistý, že by to bylo zajímavým způsobem rozbíjet složité nebo víceřádkové příkazy, ale ' nenajdu lepší způsob, jak to udělat.
- @ jw013, máte pravdu, je to zlomí se u více řádků. Vloží
clear;
do výstupu pro každý další\n
. - tento tip je velmi dobrá dávka !! Potřeboval jsem vázat nějaký konkrétní kód na F2, ale někdy má řádek nějaký příkaz, který jsem zadal, ale nebyl proveden, takže s tímto příkladem:
bind "\"\\eOQ\":\"\e[1~ls;#\\n\""
se přesune na začátek, zadejtels;#
komentovat, co tam bylo, a spustit příkazls
správně! thx!
Odpověď
z otázky, kterou jsem dnes položil (s uznáním pro uživatele @aecolley“ s odpovědí ):
bind ""\C-m": "\C-l\C-j""
\C-m
simulující klíč „Enter“, \C-l
simulující Ctrl+l
tak, jak je to jasné, a \C-j
je „newline-and-indent“, takže příkaz je závazný Zadejte klávesu Ctrl + l & Ctrl + j
, která funguje na GNU bash, verze 3.2.53 (1) -release (x86_64-apple-darwin14) a další odpovědi v tomto vlákně ne. také to neznečišťuje historii příkazy „clear“ u všech ostatních příkazů.
Komentáře
- poznámka: pokud používáte přes ssh, musíte jej spustit v tomto prostředí, jinak dojde k podivnosti.
- funguje na mém terminálu ubuntu 16.04, díky, ale jak to funguje, můžete prosím uvést odkaz nebo nějakou dokumentaci?
Odpověď
Zúčtování zvažte pouze tehdy, když chcete
cb4() { preexec () { clear } }
Používá se háček s názvem preexec
, potvrzeno funguje i se zsh
Poté bude každá relace, kterou chcete automaticky vymazat, před každým spuštěným příkazem : cb4
Pokud jste si jistí, vždy chcete vymazat v každém kontextu
preexec () { clear }
A pokud opravdu chcete resetovat terminál
nahraďte slovo clear
slovem tput reset
tput
je volitelný, ale urychluje proces resetování