GNU/Linux >> Znalost Linux >  >> Linux

Proč nemohu získat výstup Pgrep přímo na proměnnou ve skriptu Bash?

Snažím se vytvořit skript, který buď compton ukončí, pokud běží, nebo jej spustí, pokud neběží. Četl jsem od člověka, že by měl ukončit 1, pokud je nalezen proces, takže jsem se pokusil vytvořit skript, který to používá… To však prostě nefunguje, spustí se, pokud je zavřeno, ale nezavře ho. co dělám špatně??

#!/bin/bash


status=$(pgrep compton 2>&1)

if [[ $status == 1 ]];
    then
        killall compton
    else
        exec compton -b
fi

echo $status

Přijatá odpověď:

jste získání pgrep výstup ve vašem status variabilní. Prostě to není výstup, který očekáváte.

pgrep vypíše ID procesů (PID) procesů odpovídající vzoru, který mu zadáte. Pokud existuje proces, jehož název odpovídá compton a poté $status by bylo PID tohoto procesu nebo těchto procesů. pgrep také vrátí návratový stav, ale návratový stav není zachycen substitucí příkazu jako řetězec.

Ve svém testu porovnáváte $status proti 1 . Je nepravděpodobné, že compton má PID 1.

Pokud chcete zabít jakýkoli compton zpracujte, pokud existují, a spusťte compton -b pokud není compton proces existuje, můžete to provést pomocí

#!/bin/sh

if ! pkill compton; then
    exec compton -b
fi

Toto používá stav ukončení pkill . pkill nástroj funguje stejným způsobem jako pgrep (obvykle jsou distribuovány a instalovány jako pár), ale namísto výstupu PID odpovídajících procesů, jako je pgrep by stačilo, pkill odešle TERM signál (ve výchozím nastavení) do odpovídajících procesů.

if klíčové slovo používá stav ukončení příkazu, který s ním používáte.

! invertuje smysl testu tak, že

  • Pokud pkill compton uspěje, znamená to, že bylo jeden nebo několik compton procesy, které byly nyní zabity nebo alespoň signalizovány, a exec compton -b nebude proveden.

  • Pokud pkill compton selže (názvu neodpovídá žádný proces nebo došlo k nějaké vnitřní chybě v pkill ), tělo if příkaz by zavolal váš exec compton -b , který by nahradil proces shellu procesem vyplývajícím ze spuštění compton -b .


Linux
  1. Proč skript Bash nerozpozná aliasy?

  2. Proč je nastavení proměnné před příkazem v Bash legální?

  3. Proč nemohu použít CD ve skriptu Bash?

  1. Získat úplnou cestu ze skriptu Bash?

  2. Tomuto skriptu nerozumím. Bash?

  3. Příkaz Rm ve skriptu Bash nefunguje s proměnnou?

  1. Při vytváření prvního skriptu Bash nelze příkaz Cd „přilepit“?

  2. Přesměrování výstupu příkazu do proměnné v bash se nezdaří

  3. Použijte proměnnou Bash ve skriptu SLURM sbatch