Risposte:
Questo si espande in qualche modo sul !!trucco menzionato in questa risposta . In realtà ci sono un sacco di comandi relativi alla storia che tendono a dimenticarsi (le persone tendono a pugnalare Up100 volte invece di cercare un comando che sanno di aver digitato).
historycomando mostrerà un elenco di comandi eseguiti di recente con un designatore di eventi a sinistra!N sostituirà il comando associato a designatore di eventi N!-Nsostituirà il N th comando più recente; ad esempio !-1sostituirà il comando più recente, !-2il secondo più recente, ecc.!!è una scorciatoia per !-1sostituire rapidamente l'ultimo comando!string sostituirà il comando più recente che inizia con string!?string? sostituirà il comando più recente che contiene stringI designatori di parole possono essere aggiunti a un !comando di cronologia per modificare i risultati. I due punti separano l'evento e i designatori di parole, ad es !!:0. Il designatore di eventi !!può essere abbreviato solo !quando si utilizza un designatore di parole, quindi !!:0equivale a !:0.
!:0 otterrà il comando che è stato eseguito!:1otterrà il primo argomento (e !:2il secondo, ecc.)!:2-3 otterrà il secondo e il terzo argomento!:^è un altro modo per ottenere il primo argomento. !:$otterrà l'ultimo!:*otterrà tutti gli argomenti (ma non il comando)I modificatori possono anche essere aggiunti a un !comando di cronologia, ciascuno preceduto da due punti. È possibile impilare qualsiasi numero (ad es !:t:r:p.).
h - Allinea al nome file di baset - Solo il nome file di baser - Allinea all'estensione del nome filee - Solo l'estensione del nome files/search/replacement- Sostituisci la prima occorrenza di searchconreplacementgs/search/replacement- Sostituisci tutte le occorrenze di searchconreplacement!-#quelli. Uso !stringper eseguire l'ultimo comando che inizia con la stringa, ma generalmente prima lo tab-complete (zsh) per essere sicuro di eseguire la cosa giusta
!Neseguirà il comando ..." è una descrizione troppo stretta; in realtà, !Nsarà sostituito dal comando ...; e così via per tutte le descrizioni nella risposta. Più corretto e aprendo possibilità molto più utili! Ad esempio, il citato sudo !!.
bash; in Emacs, per sfogliare la cronologia dei comandi e dei valori di input (per Mx o altri valori letti) si usa invece Meta-R (Meta-R è usato anche eshellin Emacs). Quindi spesso li incasino.
bash - inserisce il parametro finale della riga precedente
alt- . la combinazione di tasti più utile di sempre, provala e vedi, per qualche motivo nessuno lo sa.
premerlo più volte per selezionare gli ultimi parametri più vecchi.
ottimo quando vuoi fare qualcosa di più sull'argomento / file che hai usato solo un momento fa.
alt- .andrà al comando precedente e tirare l'ultimo argomento da esso. Quindi, se vuoi l'ultimo argomento di tre comandi fa, premi alt- .tre volte.
yank-last-argcomando readline, quindi dovrebbe funzionare con qualsiasi programma collegato contro readline, non solo BASH o ZSH.
Il mio preferito è
man 7 ascii
Semplice e molto utile.
Oct Dec Hex Char Oct Dec Hex Char
────────────────────────────────────────────────────────────────────────
000 0 00 NUL '\0' (null character) 100 64 40 @
001 1 01 SOH (start of heading) 101 65 41 A
002 2 02 STX (start of text) 102 66 42 B
003 3 03 ETX (end of text) 103 67 43 C
004 4 04 EOT (end of transmission) 104 68 44 D
005 5 05 ENQ (enquiry) 105 69 45 E
006 6 06 ACK (acknowledge) 106 70 46 F
007 7 07 BEL '\a' (bell) 107 71 47 G
010 8 08 BS '\b' (backspace) 110 72 48 H
011 9 09 HT '\t' (horizontal tab) 111 73 49 I
012 10 0A LF '\n' (new line) 112 74 4A J
013 11 0B VT '\v' (vertical tab) 113 75 4B K
014 12 0C FF '\f' (form feed) 114 76 4C L
015 13 0D CR '\r' (carriage ret) 115 77 4D M
016 14 0E SO (shift out) 116 78 4E N
017 15 0F SI (shift in) 117 79 4F O
020 16 10 DLE (data link escape) 120 80 50 P
021 17 11 DC1 (device control 1) 121 81 51 Q
022 18 12 DC2 (device control 2) 122 82 52 R
023 19 13 DC3 (device control 3) 123 83 53 S
024 20 14 DC4 (device control 4) 124 84 54 T
025 21 15 NAK (negative ack.) 125 85 55 U
026 22 16 SYN (synchronous idle) 126 86 56 V
027 23 17 ETB (end of trans. blk) 127 87 57 W
030 24 18 CAN (cancel) 130 88 58 X
031 25 19 EM (end of medium) 131 89 59 Y
032 26 1A SUB (substitute) 132 90 5A Z
033 27 1B ESC (escape) 133 91 5B [
034 28 1C FS (file separator) 134 92 5C \ '\\'
035 29 1D GS (group separator) 135 93 5D ]
036 30 1E RS (record separator) 136 94 5E ^
037 31 1F US (unit separator) 137 95 5F _
040 32 20 SPACE 140 96 60 `
041 33 21 ! 141 97 61 a
042 34 22 " 142 98 62 b
043 35 23 # 143 99 63 c
044 36 24 $ 144 100 64 d
045 37 25 % 145 101 65 e
046 38 26 & 146 102 66 f
047 39 27 ' 147 103 67 g
050 40 28 ( 150 104 68 h
051 41 29 ) 151 105 69 i
052 42 2A * 152 106 6A j
053 43 2B + 153 107 6B k
054 44 2C , 154 108 6C l
055 45 2D - 155 109 6D m
056 46 2E . 156 110 6E n
057 47 2F / 157 111 6F o
060 48 30 0 160 112 70 p
061 49 31 1 161 113 71 q
062 50 32 2 162 114 72 r
063 51 33 3 163 115 73 s
064 52 34 4 164 116 74 t
065 53 35 5 165 117 75 u
066 54 36 6 166 118 76 v
067 55 37 7 167 119 77 w
070 56 38 8 170 120 78 x
071 57 39 9 171 121 79 y
072 58 3A : 172 122 7A z
073 59 3B ; 173 123 7B {
074 60 3C < 174 124 7C |
075 61 3D = 175 125 7D }
076 62 3E > 176 126 7E ~
077 63 3F ? 177 127 7F DEL
Dai un'occhiata a questo sito web commandlinefu.com .
Puoi anche dare un'occhiata a questi quattro articoli di Peteris Krumins sul suo blog
ascii programma separato è utile. Oltre a stampare una tabella, ti consente di eseguire una query per uno o più singoli caratteri.
Non sono sicuro che questo valga come un "trucco", ma le persone sembrano molto inconsapevoli dei tasti di scelta rapida standard readline. Di particolare utilità nelle conchiglie:
Ctrl+Lcorrisponde al carattere ascii FormFeed. In genere ridisegna lo schermo in applicazioni di testo con una finestra dello schermo (ad esempio vim, less, mc, ecc.). Bello se lo schermo è stato "inquinato" da alcuni output di un altro programma.
Ctrl+Wtagliare una parola all'indietro, Alt+Fandare avanti di una parola, Alt+Bandare indietro di una parola in una riga. Mi piace Ctrl+Ye Shift+Insertperché puoi avere due righe copiate. Uno con Ctrl+U(incollalo con Ctrl+Y) e allo stesso tempo puoi copiare un'altra parola (seleziona la riga) incolla con ( Shift+Insert).
CTRL+ Rin BASH per cercare / attivare comandi precedentemente eseguiti (il contenuto di ~ / .bash_history).
Questo è spesso estremamente utile. L'esecuzione di questo alias servirà il PWD su HTTP (indicizzato) sulla porta 8000:
alias webserver="python -m SimpleHTTPServer"
E poiché corro per tutto il tempo, spaziando e digitando troppo velocemente, questi alias sono probabilmente i miei più usati (seriamente):
alias maek=make
alias mkae=make
alias meak=make
alias amka=make
alias akme=make
E probabilmente il mio pezzo di BASH usato più di frequente è un semplice script che chiamo upload. Lo uso per aggiungere qualsiasi tipo di contenuto al mio Linode e copia l'URL HTTP risultante nei miei appunti (clic centrale). Molto utile per incollare roba alle persone in IRC:
scp -r $* $user@$host:public_html && {
URL="http://$host/~$user/$(basename $1)"
echo "$URL"
xselection -replace PRIMARY "$URL"
}
Solo un paio. Posso pubblicare molto più tardi, devo tornare al lavoro!
alias mk=makePiù veloce da digitare e meno probabile che si sbagli. Oppure compila dal tuo editor usando un tasto di scelta rapida ...
alias m=make, o anche m=make -j6o simile - tranne che uso già alias m=mutt☺
Abbastanza semplice, ma la gente non sembra saperlo, ti riporta alla directory precedente:
cd -
cd..dal DOS è radicato nella mia memoria muscolare ...
cd(senza argomenti) che ti porta alla tua home directory.
L'espansione del controvento è un meccanismo mediante il quale è possibile generare stringhe arbitrarie.
Ti permette di sostituire linee noiose come:
mv loong/and/complex/file/name loong/and/complex/file/name.bacukup
con un'istanza più breve
mv loong/and/complex/file/name{,backup}
alcuni altri usi
# to display the diff between /etc/rc.conf and /etc/rc.conf.pacsave
diff /etc/rc.conf{,.pacsave}
# to list files in both /usr/share and /usr/local/share
ls /usr/{,local}/share
Espansione aritmetica :
L'espansione aritmetica consente la valutazione di un'espressione aritmetica e la sostituzione del risultato. Il formato per l'espansione aritmetica è:
$((expression))L'espressione viene trattata come se fosse racchiusa tra virgolette doppie, ma una virgoletta doppia tra parentesi non viene trattata in modo speciale. Tutti i token nell'espressione subiscono l'espansione dei parametri, l'espansione della stringa, la sostituzione dei comandi e la rimozione delle virgolette. Le espansioni aritmetiche possono essere nidificate.
$ a=1
$ b=2
$ echo $(( a+(b*2) ))
5
foo[123]che si espanderà in foo1 foo2 foo3, ma devono essere nomi di file per funzionare in quel caso
Questo di solito è nel mio script di avvio (.bashrc, .profile, qualunque cosa)
shopt bontà, controlla i commenti:
shopt -s cdspell # try to correct typos in path
shopt -s dotglob # include dotfiles in path expansion
shopt -s hostcomplete # try to autocomplete hostnames
Un alias che salva i tasti premuti:
mkdire cdin esso:
mkcd () { mkdir -p "$@" && cd "$@"; }
E, ultimo ma non meno importante, ho rinunciato a memorizzare la sintassi tar, quindi:
extract () {
if [ -f $1 ] ; then
case $1 in
*.tar.bz2) tar xjf $1 ;;
*.tar.gz) tar xzf $1 ;;
*.bz2) bunzip2 $1 ;;
*.rar) rar x $1 ;;
*.gz) gunzip $1 ;;
*.tar) tar xf $1 ;;
*.tbz2) tar xjf $1 ;;
*.tgz) tar xzf $1 ;;
*.zip) unzip $1 ;;
*.Z) uncompress $1 ;;
*) echo "'$1' cannot be extracted via extract()" ;;
esac
else
echo "'$1' is not a valid file"
fi
}
mkcdsolo a quella che ho chiamato id md. Tuttavia, l'utilizzo di "$ @" come argomento per cd non ha alcun senso poiché non è possibile eseguire il cd in più di una singola directory. "$ @" funzionerà per mkdir, ma poi md () { mkdir -p "$1"; cd "$1" }
Due funzioni bash che mi salvano molti tasti.
Esegui automaticamente una ls dopo ogni cd riuscito:
function cd {
builtin cd "$@" && ls
}
Sali su n livelli:
# Usage .. [n]
function .. (){
local arg=${1:-1};
local dir=""
while [ $arg -gt 0 ]; do
dir="../$dir"
arg=$(($arg - 1));
done
cd $dir #>&/dev/null
}
builtin fooper andare in giro con una funzione definita cd; Ho usato chdirnelle mie funzioni. Handy
cd() { builtin cd -- "$@" && { [ "$PS1" = "" ] || ls -hrt --color; }; }
Dato che di solito sono a metà strada nella riga di comando prima di voler cercare (CTRL-R in bash) ho il seguente nel mio .bashrc
bind '"\e[A"':history-search-backward
bind '"\e[B"':history-search-forward
Questo significa che se scrivo cd quindi premo su / giù posso vedere tutte le opzioni che ho fatto su cd. Fondamentalmente lo uso per dirs spesso usati. Come "cd w" e sto finendo per esaminare tutte le aree di lavoro che uso molto.
Una cosa che mi fa risparmiare molto tempo sono i comandi pushd / popd. Questi ragazzi ti permettono di creare una pila di directory e ridurre molto la digitazione:
/foobar/ > pushd /src/whatever/foo/test
/foobar/src/whatever/foo/test > make run
/foobar/src/whatever/foo/test > popd
/foobar/ > make
ue orappresentano qui?
setopt autopushde tutte le modifiche alla directory verranno inviate automaticamente
Il screen comando . In pratica salva la sessione della riga di comando per quando torni. È una specie di gestore di terminali, come un gestore di finestre. In questo modo, in una singola sessione di terminale, puoi avere più terminali virtuali in corso. È molto bello.
Se si usa screen, questa funzione di shell (inserirla .bashrc) è estremamente utile:
function scr {
if screen -ls | grep -q Main; then
# reattach to Main:
screen -xr Main
else
# name session "Main":
screen -S Main
fi
}
durante la digitazione scr, controllerà se esiste la sessione principale e si collegherà ad essa. Altrimenti lo creerà.
Se è necessario modificare una riga di comando particolarmente lunga in bash
^X^E (Ctrl-X Ctrl-E)
lo aprirà nell'editor ($ EDITOR).
In zsh puoi ottenere lo stesso comportamento aggiungendolo a .zshrc:
autoload edit-command-line
zle -N edit-command-line
bindkey '^X^e' edit-command-line
Se sei un dattilografo veloce, questi sono utili:
alias grpe='grep --color=tty'
alias gpre='grep --color=tty'
alias rgep='grep --color=tty'
alias gerp='grep --color=tty'
Questa macro ti aiuta a calcolare i totali di una colonna di output: dimensioni del file, byte, pacchetti, tutto ciò che devi fare è specificare la colonna che vuoi aggiungere:
total ()
{
if [ x$1 = x ]; then set `echo 1`; fi
awk "{total += \$$1} END {print total}"
}
Lo usi in questo modo, ad esempio, senza argomenti, aggiunge il totale della prima colonna:
du | total
Se fornisci l'argomento, sommerà quella colonna, per esempio, questo ti darà il numero totale di byte usati da tutti i file C # in / tmp:
ls -l /tmp/*cs | total 5
A volte la tua console viene incasinata perché hai accidentalmente visualizzato un file binario (cat / bin / ls per esempio), puoi ripristinare il terminale con questa funzione di shell:
restaura ()
{
perl -e 'print "\e)B";'
}
Mi piace che io usi i caratteri per distinguere la classe di file e anche per nascondere i file di backup generati dal mio editor (i file di backup terminano con il carattere ~):
alias ls='ls -FB'
s/fast/sloppy/
resetdove usi tu restaura.
alias s='sudo'
alias r='rake' # i'm a ruby developer
alias ..='cd ..' # although with autocd feature for zsh this comes packed.
Uno dei miei preferiti quando dimentico s:
$ s !! # last command with super user priviledges
bindkey -s '\e[12~' "sudo !!\n"legare (in questo caso) F2 per eseguire quel comando. Ho quell'associazione, quindi quando eseguo qualcosa e vedo il messaggio di errore "hai dimenticato 'sudo', sciocco", posso solo infastidire F2 con fastidio
Se un comando accetta l'input stdin, è possibile leggere l'input da un file con <filename. Questo può apparire ovunque nel comando, quindi queste linee sono equivalenti:
cat filename
cat <filename
<filename cat
Ciò è particolarmente utile per grep, in quanto consente di posizionare l'espressione alla fine della riga, quindi è possibile modificare rapidamente un comando grep colpendolo Up, senza dover scorrere a sinistra per superare il nome file:
<filename grep 'expression'
<input foo | bar | baz >output, non funziona se provi a mescolare alcune primitive di shell loop come whileo fornel mezzo. Quindi ho rinunciato e l'ho messo alla fine come da convenzione.
È possibile utilizzare CDPATHper impostare l'equivalente di directory di PATH; se provi a farlo cd fooe non ce n'è foonella directory corrente, la shell controllerà ciascuna delle directory che sta CDPATHcercando fooin essa e passerà alla prima che trova:
export CDPATH="/usr"
cd bin # switches to 'bin' if there is one in the current directory, or /usr/bin otherwise
vi `which scriptname`
Per quando non sai dove abita qualcosa e non ti interessa neanche.
whichautomaticamente, quindivi =scriptname
$(scriptname)
La e commerciale . Mette il tuo comando in background, così puoi continuare a digitare.
$> sudo updatedb &
Lavorando insieme e dopo un po 'vedi:
[1] 17403
E il tuo processo è fatto! Ottimo per le cose in cui non è necessario attendere che terminino.
&!allo sfondo il lavoro e rinnegalo dalla shell!
bash.
nohupquesto compie questo.
Completamento della scheda . Quanto sarebbe dannoso se dovessi scrivere tutti i personaggi di ogni percorso?
rm -fr /. Quindi sì, il completamento della scheda è piuttosto vitale ...
ls /usr/lib/game-d*/rott*
rm -rf /disabilitato nella maggior parte dei sistemi Linux?
Smonta ultimo dispositivo montato:
mount /media/whatever
...
u!mo
!mosi espande all'ultimo comando iniziato con mo(almeno in bash). A volte uno fa mvnel mezzo, quindi u!mnon funzionerà così spesso.
Ho questo nel mio .bashrc
#shortcut for CTRL+C and CTRL+V
alias c-c='xclip -sel clip'
alias c-v='xclip -o -sel clip'
function find-all() {
python -c "import re
import sys
for i in re.findall('$1', sys.stdin.read()):
if type(i) == type(''):
print i
else:
print i[0]"
}
E quando ho il codice sorgente HTML negli Appunti e voglio trovare tutti i collegamenti che uso
c-v | find-all 'href="([^"]*)"' | c-c
E ho tutti gli URL negli appunti
Ho anche questa funzione
function lsq(){
ls -lh $@ | tr -s ' ' | cut -d' ' -f5,8
}
quale dimensione di visualizzazione (leggibile dall'uomo) e nome file.
alias temp='cat /proc/acpi/thermal_zone/THRM/temperature'
questo alias è per la temeratura dello spettacolo
function separate() {
python -c "import sys,re; print '$1'.join(re.split('\s*', sys.stdin.read().strip()))";
}
con questa funzione posso calcolare il prodotto o la somma degli argomenti.
alias sum='separate + | bc'
alias product='separate * | bc'
function split-join() {
python -c "import sys,re; print '$2'.join(re.split('$1', sys.stdin.read().strip()))";
}
Questa è una funzione utile che divide l'input standard separato da regex e quindi unisce il risultato.
function factorial() {
seq -s* $1 | bc
}
funzione fattoriale
function wiki() { dig +short txt $1.wp.dg.cx; }
Questa funzione visualizza il testo wiki su DNS
Ho anche tre funzioni di colore
function blue() {
echo -e "\x1b[34m\x1b[1m"$@"\x1b[0m";
}
function green() {
echo -e "\x1b[32m\x1b[1m"$@"\x1b[0m";
}
function red() {
echo -e "\x1b[31m\x1b[1m"$@"\x1b[0m";
}
function md5check() {
test `md5sum $2 | cut -d' ' -f1` = "$1" && green [OK] || red [FAIL]
}
Questa funzione convalida l'hash del file md5.
questo mostrerà un messaggio di errore per un dato codice
function strerror() { python -c "import os; print os.strerror($1)"; }
Puoi stampare tutti i messaggi con
alias all-errors='for i in `seq 131`; do echo -n "$i: "; strerror $i; done'
Un altro utile trucco ZSH:
Tratta l'output di un comando come un file:
emacs =(hg cat -r 100 somefile)
Questo apre una vecchia versione di un file tracciato da Mercurial in emacs per la visualizzazione evidenziata dalla sintassi. Senza questo, avrei dovuto pasticciare con hg revert, hg archiveo in modo esplicito di inviare hg catl'output a un file temporaneo.
Ovviamente, questo funziona con qualsiasi programma che apre file e qualsiasi programma che stampa sullo standard output.
Una caratteristica specifica di ZSH sono gli alias di suffisso, impostati dando aliasil -sflag:
alias -s ext=program
Se una data estensione ha un alias di suffisso, puoi eseguire direttamente un file con quella estensione e ZSH avvierà il programma dato e passerà il nome del file come argomento. Quindi, se l'alias sopra è attivo, queste righe sono equivalenti:
/path/to/foo.ext
program /path/to/foo.ext
Una delle mie funzioni preferite di sempre di ZSH è denominata directory. Puoi esportare una variabile con un determinato nome, con un valore che punta a un determinato percorso:
export foo=/usr/bin
Ora puoi usare ~fooin un comando per fare riferimento a /usr/bin:
cd ~foo
~foo/ls
cat ~foo/filename
Vedere questo domanda .
Quando corri ps ax | grep string:
[steve@sage-arch ~]$ ps ax | grep 'openbox'
3363 ? Ss 0:00 /usr/bin/openbox
3382 ? Ss 0:00 /usr/bin/ssh-agent -- /usr/bin/openbox-session
3386 ? S 0:00 /bin/sh /usr/bin/openbox-session
3388 ? S 0:00 /bin/sh /usr/bin/openbox-session
3389 ? S 0:00 /bin/sh /usr/bin/openbox-session
3390 ? S 0:00 /bin/sh /usr/bin/openbox-session
5100 pts/0 S+ 0:00 grep openbox
l'ultima riga contenente grepè qualcosa di un po ' ansioso
Puoi liberarti di questo eseguendo ps ax | grep '[s]tring':
[steve@sage-arch ~]$ ps ax | grep '[o]penbox'
3363 ? Ss 0:00 /usr/bin/openbox
3382 ? Ss 0:00 /usr/bin/ssh-agent -- /usr/bin/openbox-session
3386 ? S 0:00 /bin/sh /usr/bin/openbox-session
3388 ? S 0:00 /bin/sh /usr/bin/openbox-session
3389 ? S 0:00 /bin/sh /usr/bin/openbox-session
3390 ? S 0:00 /bin/sh /usr/bin/openbox-session
aggiornamento : o semplicemente eseguipgrep string
'[o]penbox'). Le parentesi funzioneranno come una specie di glob, quindi se nella tua directory c'è openbox (diciamo che sei dentro /usr/bin) bash userà semplicemente openbox, il che impedirà il trucco grep.
Il comando do-nothing :come in
while :; do :; doneEspansione del rinforzo in combinazione con per i loop:
for c in {1..3}; do :; done!operatore e operatori di corto circuito ||e&&
[ -d /tmp/dir ] || mkdir /tmp/dir
if ! ping 34.41.34.1; then :; fiusando sub shell invece di pop / push (è utile negli script)
~$ ( cd /tmp; echo $PWD )
/tmp
~$il tipo di comando what-istype
~$ type type
type is a shell builtin
~$ type ls
ls is aliased to `ls --color=auto'
~$ f(){ :; }
~$ type f
f is a function
f ()
{
:
}anche molto bello: qui-stringhe
~$ cat <<<"here $PWD"
here /home/yourname
~$e il mio preferito: reindirizzamento su un elenco di comandi
{ w; ps; ls /tmp; } 2>/dev/null |lessAdoro buttare quanta più roba possibile nella mia PS1. Alcune cose utili da ricordare:
\e[se \e[usalva e salva la posizione del cursore rispettivamente. Lo uso per creare una "barra delle informazioni" nella parte superiore dello schermo, lunga un paio di righe, che può contenere più cose. Esempio:
PS1='\[\e[s\e[7m\e[1;1H\]\w\n\t \j / \! / \#\[\e[u\e[0m\e[33;1m\][\u@\h \[\e[34m\]\W]\[\e[0m\]\$ '
Unisci con alias clear='echo -e "\e[2J\n"' . Provalo!
Anche il PROMPT_COMMAND variabile definisce un comando da eseguire prima di PS1 ogni volta.
Un altro è il bgcomando. Se si dimentica di mettere &alla fine di un comando, basta premere ^Ze digitare bge verrà eseguito in background.
bg, quando ho un programma in esecuzione in background e premo accidentalmente fgnon so come respingerlo: D
PS1quindi ho messo la maggior parte delle cose che voglio nella mia linea di fondo dello schermo ...