Cosa significa e commerciale alla fine di una riga di script della shell?


118
sh sys-snap.sh &

Che cosa è sh? Che cosa è sys-snap.sh? Perché dovrei mettere &alla fine della linea? Qualcuno può spiegare la sintassi?

Senza lo &script non tornerà al prompt finché non premo Ctrl+ C. Con &posso premere invio e funziona.


2
la doppia e commerciale è &&diversa da una singola e commerciale &?
Charlie Parker,

1
@CharlieParker Hai mai trovato una risposta a questo? Sto cercando di capire la differenza da solo. (Modifica: Nevermind, l'ho trovato più in basso)
Drazen Bjelovuk,

Risposte:


94

shè la shell compatibile con Bourne predefinita (di solito bash o dash)

sys-snap.shè uno script di shell, che contiene comandi che vengono sheseguiti. Dato che non pubblichi il suo contenuto, posso solo immaginare dal suo nome, cosa fa. Posso trovare uno script correlato a CPanel con lo stesso nome di file, che crea un file di registro con tutti i processi correnti, l'utilizzo corrente della memoria, lo stato del database ecc. Se lo script inizia con una riga shebang ( #!/bin/sho simile), è possibile renderlo eseguibile con chmod +x sys-snap.she avviarlo direttamente utilizzando ./sys-snap.shse si trova nella directory corrente.

Con &il processo inizia in background, quindi puoi continuare a usare la shell e non devi aspettare fino al termine dello script. Se lo dimentichi, puoi interrompere il processo in esecuzione con Ctrl-Ze continuare in background con bg(o in primo piano con fg). Per ulteriori informazioni, consultare Controllo dei lavori


4
shdi solito solo basho dashin sistemi basati su Linux (o recente OS / X). Su BSD, di solito è un'altra variante di Ash (il trattino si basa su NetBSD sh, esso stesso basato sulla Almquist Shell) o un derivato pdksh. Su Unices commerciali, è generalmente ksh88.
Stéphane Chazelas,

1
@jofel: Cosa succede se lo script seguente è in esecuzione e per errore ho eseguito Ctrl-C. Il mio script verrà eseguito o verrà terminato? Es: sh sys-snap.sh &
Hussain7

2
@ Hussain7 Ctrl-C viene inviato sempre al processo corrente in primo piano. Se lo shell-script viene avviato con &e quindi in background, viene visualizzato solo un nuovo prompt della shell.
jofel

2
la doppia e commerciale è &&diversa da una singola e commerciale &?
Charlie Parker,

7
@CharlieParker Sì, "&&" è la funzione "e". Il comando dopo && viene chiamato solo quando il comando precedente ha esito positivo. L'esempio "true && echo funziona" output "funziona, ma" false && echo no output "non chiama la funzione echo.
jofel

87

Questo è noto come job controlunix. La &informa il guscio di mettere il comando in background. Ciò significa che continua a eseguire il sys-snap.shcomando ma ti riporta alla shell per permetterti di continuare a eseguire comandi paralleli.

È possibile visualizzare l'elenco dei lavori attualmente in esecuzione con il jobscomando. È possibile tornare al comando (portare in primo piano) con l'uso del fgcomando. Il che riporta il comando allo stato in cui non vedi alcun prompt e devi emettere Ctrl- Cper terminare il processo. È comunque possibile sospendere (mettere in pausa) tale processo, emettendo Ctrl- Z. Questo farà una pausa sys-snap.she ti farà tornare al tuo prompt. Puoi quindi metterlo in background (come se lo avessi emesso con il &) con il bgcomando, e riprenderà a funzionare dal suo stato di pausa il Ctrl- l' Zaveva inserito.

Nota che puoi avere più di un lavoro alla volta (come mostrato da jobs):

[1]-  Running          sys-snap.sh &
[2]+  Running          another-script.sh &

Puoi metterli in background e in primo piano usando il loro numero di lavoro, %1sarà sys-snap.she %2sarà another-script.sh. Se si utilizza fgo bgsenza argomenti sarà l'azione del comando sul posto di lavoro segnato da +in jobsuscita sopra.

fg %1

tornerà sys-snap.shin primo piano, lasciando another-script.shsullo sfondo.

È possibile eseguire la sequenza Ctrl- Cper l'esecuzione dei lavori senza doverli mettere in primo piano con il killcomando, kill %1invierà l'equivalente di Ctrl- Ca sys-snap.sh.

Se si utilizza la shell bash, il man bashcomando ha una sezione dettagliata nella sezione intitolata "CONTROLLO LAVORO" che va più in dettaglio.

Per quanto riguarda il nome di sys-snap.sh, sotto i nomi di file unix sono arbitrari (con un paio di eccezioni come i file del caricatore dinamico). Non è necessario che abbiano estensioni di file specifiche per farli funzionare come script di shell, invocare altri comandi come perlo phpecc. Di solito viene utilizzato per fornire chiarezza, che in questo caso è .shuno script di shell che utilizza Bourne Shell /bin/sh.

La parte funzionale di sys-snap.sh(quando guardi il contenuto con qualcosa come il lesscomando) è lo Shebang . Sulla prima riga troverai probabilmente uno di:

#! /bin/sh
#! /bin/bash
#! /usr/local/bin/bash

o simili. In termini di base, un comando dopo l' esecuzione #!(come /bin/sh) viene eseguito e il contenuto del resto del file di script viene inviato ad esso una riga alla volta. Si noti che il file deve anche essere impostato come eseguibile in chmodmodo da poterlo eseguire come comando. Se le autorizzazioni non sono state impostate, allora shebangnon ha alcun effetto, poiché si otterrebbe l'errore:

bash: sys-snap.sh: command not found

o se lo avessi eseguito per percorso esplicito ./sys-snap.sh( .intendendo l'attuale directory di lavoro) otterrai:

bash: ./sys-snap.sh: Permission denied

L'altra alternativa è lasciarlo senza eseguire le autorizzazioni e chiedere esplicitamente a / bin / sh di eseguirlo:

/bin/sh sys-snap.sh &

3
questa è un'ottima risposta un possibile suggerimento è quello di aggiungere anche ciò che nohupfa, poiché viene spesso utilizzato insieme &per avviare un processo ed essere in grado di uccidere la shell che lo ha avviato senza uccidere il processo.
Tommy,

@Drav, è vero che jobstornerà sempre vuoto se è il primo comando?
Pacerier,

Si noti che l'utilizzo &alla fine di un comando si stacca solo stdin(ma non stdouto stderr), il che implica se il comando / script è in esecuzione in background ma si sta scrivendo stdout, si potrebbe verificare una situazione in cui Ctrl + cnon si fermerà l'output ma si sarebbe in grado per digitare i comandi. Questo perché il processo in background sta scrivendo stdoutma non puoi fermarlo perché non è in esecuzione in primo piano. Maggiori informazioni qui .
vadasambar,

4

shè una conchiglia. Quale shell dipende esattamente dal sistema. Esempio per un sistema che utilizza bashcome shell standard:

$ ls -l /bin/sh
lrwxrwxrwx 1 root root 4 Mar 13 16:12 /bin/sh -> bash

$ sh --version
GNU bash, version 4.2.45(1)-release (x86_64-pc-linux-gnu)

sys-snap.shsarà uno script di shell di qualche tipo, quindi sh sys-snap.sheseguirà lo script di shell.

&farà eseguire il processo di shell in background. Senza di &essa rimarrà in primo piano fino alla fine della sceneggiatura. Lo script funzionerà in entrambi i modi, è solo una questione di attendere la fine dello script o meno prima di eseguire ulteriori comandi.


1

Il tuo server è in hostgator?

Lo script sys-snap.shè uno script speciale scritto dal team di hostgator per raccogliere tutti i file di registro e i dati per il sistema, in modo che utilizzino il suo output nel monitoraggio e nella raccolta delle informazioni di sistema.


No, non sto usando hostgator.
user4951

1
@ J.Chang Lo script fa parte di cPanel che Hostgator e centinaia di altri host usano.
472084,

@ 472084, Quale versione del pannello?
Pacerier,
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.