it-swarm-eu.dev

Pochopení vykřičníku (!) V bash

Použil jsem

history | less

pro získání řádků předchozích příkazů az čísel na levé straně jsem našel řádek, který jsem chtěl opakovat (např. 22) a udělal

!22

na příkaz Prompt a fungovalo to - provádění sady příkazů na řádku, který jsem tehdy udělal. Nedokážu přijít na to, kde je vykřičník používán, co představuje, pokud jde o kroky podniknuté bashem, a kde je použít. Z dokumentace nevidím vysvětlení, které je „hmatatelné“.

112
Vass

! je funkce, která se původně objevila v C Shell , ve dnech, kdy jste mohli počítat s tím, že terminály budou mít klávesy se šipkami. Je to zvláště užitečné, pokud do výzvy přidáte aktuální číslo příkazu (PS1="\!$ "), abyste se mohli rychle podívat na obrazovku a získat čísla pro minulé příkazy.

Nyní, když můžete použít klávesy se šipkami a podobně Ctrl-R Abych prohledal historii příkazů, pro tuto funkci moc nevidím.

Jednou z variant, které by se vám mohly hodit, je !!, který znovu provede předchozí příkaz. Sama o sobě nenajdu !!Enter rychlejší než jen Enter, ale může být užitečné, když se spojí do většího příkazu.

Příklad: Běžná chyba pilota na Sudo založené systémy mají zapomenout předpona Sudo pro příkaz, který vyžaduje zvláštní oprávnění. Začátečník přepíše celý příkaz. Pečlivý student edituje příkaz z historie příkazů Shell. Osvícený jeden typ Sudo !!.

Bash vám umožní zakázat ! zpracování ve skořápce s set +o histexpand nebo set +H. Můžete jej deaktivovat v Zsh pomocí set -K.

157
Warren Young

Pokud zde již není odpověď, určitě existuje na Super User, protože jsem ji nedávno četl. Na stránce bash man najdete obrovskou sekci nazvanou HISTORIE ROZŠÍŘENÍ .

Můžete udělat celý hostitel více než jen spustit poslední příkaz nebo číslo příkazu X. Můžete dělat věci jako !cat pro spuštění posledního příkazu, který začal s cat. Nebo !?bash?:s/bash/csh/ spustí poslední příkaz obsahující bash, ale nahradí jej csh.

52
Cry Havok

S ! jako:

  • spusťte příkaz, který je zadán před 3 příkazy: !-3
  • spusťte příkaz, který začíná na !ls

a mnohem více. Viz 15 příkladů rozšíření historie linií Linuxu, které byste měli znát

40
user379997

Samozřejmě můžete udělat !! pro opětovné použití posledního příkazu v bash Shell. A pak je !$ znovu použít poslední část posledního příkazu.

např. zobrazit nějaký soubor

less path/to/your/file.txt

Pokud nyní chcete upravit stejný soubor, můžete použít !$ získat pouze cestu k souboru od posledního příkazu

vim !$

UPRAVIT:

Všechny argumenty předchozího příkazu můžete použít s !*

např .: Tím vytvoříte některé soubory a odstraníte je všechny

$ touch a.txt b.txt c.txt d.txt
$ rm !*

Opět můžete použít konkrétní argument předchozího příkazu

např. Tím se vytvoří 4 soubory a odstraní se 3. soubor (c.txt)

$ touch a.txt b.txt c.txt d.txt
$ rm !:3

Podobně můžete použít řadu argumentů z posledního příkazu následujícím způsobem

$ touch a.txt b.txt c.txt d.txt
$ rm !:2-4

Tím se znovu použijí argumenty 2 až 4, které vyhodnocují výraz rm b.txt c.txt d.txt

6

Můj přítel mi poslal e-mailem toto:

Je součástí historické knihovny GNU). V bash se používá k opětovnému spouštění příkazů ve vaší historii. Pokud chcete být hardcore, grep for history_expansion_char v bash-4.1/lib/readline/histexpand .c pro podrobnosti o implementaci.

4
Vass