Introduzione
Il exec
di Linux command esegue un comando Shell senza creare un nuovo processo. Sostituisce invece l'operazione Shell attualmente aperta. A seconda dell'utilizzo del comando, exec
ha comportamenti e casi d'uso diversi.
Questo articolo mostra come utilizzare il exec
comando in Linux.
Prerequisiti
- Accesso alla riga di comando/terminale come sudo.
- Comprensione di base dei comandi del terminale Linux (usa il nostro cheat sheet dei comandi Linux).
- Un editor di testo Linux come nano.
Sintassi del comando Linux exec
Il exec
la sintassi del comando è:
exec [options] [command [arguments]] [redirection]
Il comando si comporta in modo diverso a seconda del numero di argomenti:
- Se è presente un argomento, il
exec
comando sostituisce la shell corrente con il programma eseguito. In uno script Bash, ogni comando successivo non viene eseguito . - Se non è presente alcun argomento di comando, tutti i reindirizzamenti si verificano nella shell corrente.
Il exec
comando non ritorna mai al processo originale a meno che non si verifichi un errore o il comando venga eseguito in una subshell.
Opzioni comando Linux exec
Di seguito è riportata una breve spiegazione di tutti i exec
opzioni:
Opzione | Descrizione |
---|---|
-c | Esegue il comando in un ambiente vuoto. |
-l | Passa un trattino (- ) come argomento zero. |
-a [name] | Passa un [name] come argomento zero. |
Continua a leggere per vedere come exec
funziona attraverso esempi.
Esempi di comando Linux exec
Gli esempi seguenti mostrano il comportamento del exec
comando nel terminale e tramite gli script Bash.
Utilizzo di base (sostituzione del processo)
Per vedere come exec
funziona, procedi come segue:
1. Apri il terminale ed elenca i processi in esecuzione:
ps
L'output mostra la shell Bash attualmente in esecuzione e il ps
comando. La shell Bash ha un PID univoco.
2. Per confermare, controllare l'ID del processo corrente con:
echo $$
Il PID è lo stesso dell'output di ps
comando, indicando che questo è il processo Bash attualmente in esecuzione.
3. Ora esegui exec
e passa il comando sleep per cento secondi:
exec sleep 100
Il sleep
il comando attende 100 secondi.
4. In un'altra scheda del terminale, elenca tutti i processi attualmente in esecuzione e grep il sleep
comando:
ps -ae | grep sleep
Il PID per il processo è lo stesso del PID della shell Bash, che indica il exec
comando ha sostituito il processo della shell Bash.
La sessione Bash (scheda terminale) si chiude quando i cento secondi sono terminati e il processo termina.
Sostituisci la sessione Shell corrente
Usa il exec
comando per sostituire la sessione della shell corrente:
1. Controlla il PID della shell corrente:
echo $$
2. Usa exec
per passare alla Bourne Shell:
exec sh
3. In un'altra scheda, controlla il PID per il processo Bourne Shell:
ps -ae | grep "\bsh\b"
Nota: Il \b
in grep
è Regex per la corrispondenza del limite di parole, consentendo una corrispondenza esatta di sh
nell'uscita. Scopri di più nel nostro tutorial su Grep Regex.
Il comando sostituisce il processo Bash. L'uscita da Bourne Shell esce completamente dalla sessione del terminale.
Programma chiama con exec negli script Bash
Per vedere come exec
funziona negli script Bash, procedi come segue:
1. Apri un editor di testo, come Nano, e crea un file di script:
nano [script name]
2. Incolla il seguente codice:
#!/bin/bash
while true
do
echo "1. Update "
echo "2. Upgrade "
echo "3. Exit"
read Input
case "$Input" in
1) exec sudo apt update ;;
2) exec sudo apt upgrade ;;
3) break
esac
done
Lo script esegue le seguenti operazioni:
- Riga 3 crea un
while
infinito ciclo. - Righe 5-7 stampa le tre possibili opzioni.
- Riga 8 legge l'input dell'utente nella variabile
$Input
. - Riga 9 avvia un
case
dichiarazione che controlla l'input dell'utente. - Righe 10-11 eseguire il
apt update
oapt upgrade
comando al posto della shell corrente. Al termine del processo di aggiornamento o aggiornamento, la sessione del terminale viene chiusa. - Riga 12 utilizza il
break
istruzione per uscire dall'infinitowhile
loop e termina lo script. La sessione torna alla shell corrente come al solito.
3. Salva lo script e chiudi Nano.
4. Esegui lo script Bash nell'ambiente corrente per vedere i risultati:
. [script name]
L'esecuzione dello script con il comando source applica il comportamento dello script alla shell Bash corrente. Usa exec
per eseguire script Bash all'interno di altri programmi per un'uscita pulita.
Registrazione degli script Bash
Il exec
Il comando trova impiego nella manipolazione dei descrittori di file per la registrazione degli errori negli script Bash. I descrittori di file Linux predefiniti sono:
- stdin (0) - Standard in
- Stdout (1) - Standard out
- stderr (2) - Errore standard
Usa il exec
comando e reindirizzare i descrittori di file a un file per creare i log. Per vedere come funziona la registrazione, procedi nel seguente modo:
1. Crea uno script Bash di esempio:
nano logging.sh
2. Incolla il codice nel file:
#!/bin/bash
# Create test.log file
touch test.log
# Save test.log to log_file variable
log_file="test.log"
# Redirect stdin to $log_file
exec 1>>$log_file
# Redirect stderr to the same place as stdin
exec 2>&1
echo "This line is added to the log file"
echo "And any other lines after"
eho "This line has an error and is logged as stderr"
Lo script reindirizza tutti gli output e gli errori dei comandi allo stesso file (test.log ).
3. Salva lo script e chiudi l'editor di testo.
4. Modificare l'autorizzazione dello script in eseguibile:
chmod +x logging.sh
5. Esegui lo script:
./logging.sh
Lo script non genera alcun codice. Invece, tutti i log di output vengono registrati in test.log file.
6. Usa il comando cat per vedere test.log contenuto del file:
cat test.log
Il file di registro contiene tutti gli output standard e i messaggi di errore. Usa exec
per eseguire il debug di script e registrare input, output o errori a seconda della situazione.
Esegui script in un ambiente pulito
Il -c
opzione per il exec
comando crea un ambiente pulito. Per eseguire una dimostrazione, fai quanto segue nel terminale:
1. Avvia una nuova sessione della shell Bash:
bash
2. Usa il printenv
comando per stampare tutte le variabili d'ambiente nella shell Bash corrente:
printenv
Il comando stampa tutte le variabili d'ambiente per la sessione della shell Bash corrente.
3. Esegui lo stesso comando utilizzando exec
con il -c
bandiera:
exec -c printenv
Il comando printenv
viene eseguito in un ambiente pulito e nessuna variabile emessa nella console. Usa il -c
opzione per eseguire script o comandi in ambienti puliti.
exec con trova comando
Il comando find in Linux ha il exec
comando come opzione per eseguire un'azione sul contenuto scoperto. Ad esempio, la riga seguente esegue il chmod
comando sul find
risultati del comando:
sudo find ~ -name "test.log" -exec chmod +x '{}' \;
Il find
il comando cerca nella directory home (~ ) per il test.log file ed esegue la modifica dell'autorizzazione.
Conclusione
Dopo aver seguito gli esempi di questo tutorial, dovresti sapere come utilizzare il exec
comando in modo efficace negli script Bash.
Quindi, scopri come eseguire automaticamente un lavoro al riavvio utilizzando Crontab.