Comando Bash da copiare prima del cursore e incollare dopo?


24

Non sono sicuro di come pronunciare questo, ma spesso mi trovo a digitare comandi come questo:

cp /etc/prog/dir1/myconfig.yml /etc/prog/dir1/myconfig.yml.bak

Di solito scrivo due volte il percorso (con il completamento della scheda) o copierò e incollerò il percorso con il cursore. Esiste un bashfoo che semplifica la digitazione?


2
Penso che intendi bash-fu:)
gatto

Risposte:


43

Ci sono un certo numero di trucchi (penso che ci sia un duplicato da trovare), ma per questo tendo a farlo

cp /etc/prog/dir1/myconfig.yml{,.bak}

che viene espanso al tuo comando.

Questo è noto come espansione del controvento . Nel modulo utilizzato qui, l' {}espressione specifica un numero di stringhe separate da virgole. Questi "espandono" l'intera /etc/prog/dir1/myconfig.yml{,.bak}espressione, sostituendo la {}parte con ogni stringa a turno: la stringa vuota, dando /etc/prog/dir1/myconfig.yml, e quindi .bak, dando /etc/prog/dir1/myconfig.yml.bak. Il risultato è

cp /etc/prog/dir1/myconfig.yml /etc/prog/dir1/myconfig.yml.bak

Queste espressioni possono essere nidificate:

echo a{b,c,d{e,f,g}}

produce

ab ac ade adf adg

C'è una variante che utilizza i numeri per produrre sequenze:

echo {1..10}

produce

1 2 3 4 5 6 7 8 9 10

e puoi anche specificare il passaggio:

echo {0..10..5}

produce

0 5 10

accidenti è dolce. Immaginai di non essere il primo a porre, solo una specie di domanda complicata a parole.
user1028270,

Cosa ci fa la virgola?
user1028270,

5
Vedi Brace Expansion nel manuale: separa i valori utilizzati nell'espansione. Qui i due valori sono la stringa vuota e .bak.
Stephen Kitt,

12

L'espansione della cronologia può essere utile per questo tipo di cose (supponendo che la cronologia di bash sia abilitata).

Nel tuo esempio, potresti fare:

cp /etc/prog/dir1/myconfig.yml !#:1.bak

Qui, si !#riferisce alla riga corrente, si !#:1riferisce al parametro 1 sulla riga corrente
e si !#:1.bakriferisce al parametro 1 sulla riga corrente con '.bak' incollato all'estremità.

Dopo aver digitato l'identificatore di cronologia, è possibile utilizzare Ctrl+ Alt+ Eper espanderlo al valore effettivo se si desidera ad esempio ricontrollare o modificare il nome file.

La sezione "Espansione della storia" nelle pagine man di bash ha maggiori informazioni.


8

Simile alla risposta di Progo, ma in qualche modo più semplice: C-wtaglia ("uccide") la parola a sinistra del cursore, la C-yinserisce ("strappa") di nuovo.

$ cp /etc/dir1/myconfig.yml                              (C-w)
$ cp                                                     (C-y)
$ cp /etc/dir1/myconfig.yml                              (space, C-y)
$ cp /etc/dir1/myconfig.yml /etc/dir1/myconfig.yml       (finish text)
$ cp /etc/dir1/myconfig.yml /etc/dir1/myconfig.yml.bak

2
Vale anche la pena notare che è possibile farlo con più parole in una riga (se il nome del file ha spazi, ad esempio) e Cy li incollerà tutti, purché non si sia spostato il cursore o non sia stato digitato altro. Qualsiasi combinazione di comandi di eliminazione ad eccezione delle eliminazioni di singoli caratteri (ad esempio backspace / del / ctrl-d) funziona con questo.
Casuale 832

6

Puoi anche effettivamente tagliare e incollare (kill-yank in termini di emacs / bash) dalla riga di comando per duplicare le parti per la modifica.

M-duccide in avanti fino al limite delle parole, e puoi uccidere il testo più volte e vengono tutti concatenati insieme in una singola "incolla" per lo strappo. Conveniente!

Riporta tutto alla riga di comando al cursore di C-y. Quindi se hai una linea come questa (l'elemento a blocchi █ indica la posizione del cursore):

$ cp avb.txt                 (M-b M-b)
$ cpavb.txt                  (M-d) kill the word 'avb'
$ cp █.txt                    (C-y) yank it back
$ cp avb█.txt                 (C-e) to the end of line
$ cp avb.txt                 (C-y) yank it again
$ cp avb.txt avb             finish the line
$ cp avb.txt avb.foo

In entrambi i casi preferisci farlo, familiarizzare con ciò che bash ha da offrire nel dipartimento chiave interattivo sarà utile. http://web.mit.edu/gnu/doc/html/features_7.html


6

In tcsho zsh, Alt+Ctrl+_in emacsmodalità ( copy-prev-wordwidget) inserisce l'ultima parola, quindi

cp molto lungo percorso Alt+Ctrl+_.back

bashha un copy-backward-wordwidget (non associato a nessun tasto per impostazione predefinita) ma che copia solo la parola nel buffer dell'anello, dovresti anche premere Ctrl-Y(in emacsmodalità) per strapparlo. Ma potresti fare:

bind '"\e[cpw~": copy-backward-word'
bind '"\e\C-_": "\e[cpw~\C-Y"'

Per Alt+Ctrl+_fare sia copia / snarf sia incolla / yank come in tcsh/ zsh.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.