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
execcomando 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
whileinfinito ciclo. - Righe 5-7 stampa le tre possibili opzioni.
- Riga 8 legge l'input dell'utente nella variabile
$Input. - Riga 9 avvia un
casedichiarazione che controlla l'input dell'utente. - Righe 10-11 eseguire il
apt updateoapt upgradecomando al posto della shell corrente. Al termine del processo di aggiornamento o aggiornamento, la sessione del terminale viene chiusa. - Riga 12 utilizza il
breakistruzione per uscire dall'infinitowhileloop 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.