it-swarm.it

Lo script di Bash stampa sempre "Command Not Found"

Ogni volta che eseguo uno script usando bash scriptname.sh dalla riga di comando in Debian, ottengo Command Not found e quindi il risultato dello script. Quindi lo script funziona ma c'è sempre una dichiarazione Command Not Found stampata sullo schermo.

Sto eseguendo lo script dalla cartella /var.

Ecco la sceneggiatura:

#!/bin/bash

echo Hello World

Lo eseguo digitando quanto segue:

bash testscript.sh

AGGIORNAMENTO: il problema appare sulle righe vuote. Ogni riga vuota risulta in un comando non trovato. Perché dovrebbe accadere?

87
David

Assicurati che la prima linea sia:

#!/bin/bash

Inserisci il tuo percorso per bash se non è /bin/bash


Prova a correre:

dos2unix script.sh

Ciò consente di convertire le terminazioni di linea, ecc. Da Windows in unix formato. cioè si separa\r (CR) dalle terminazioni di riga per cambiarle da \r\n (CR+LF) a \n (LF).

Ulteriori dettagli sul comando dos2unix (man page)


Un altro modo per dire se il tuo file è in formato DOS/Win:

cat scriptname.sh | sed 's/\r/<CR>/'

L'output sarà simile a questo:

#!/bin/sh<CR>
<CR>
echo Hello World<CR>
<CR>

Questo produrrà l'intero testo del file con <CR> visualizzato per ogni carattere \r nel file.

141
chown

Puoi usare bash -x scriptname.sh per tracciarlo.

46
clyfish

Ho anche avuto un problema simile. Il problema sembra essere permessi. Se fai un ls -l, potresti essere in grado di identificare che il tuo file potrebbe NON avere il bit di esecuzione attivato. Questo NON permetterà lo script da eseguire. :)

Come @artooro ha aggiunto nel commento:

Per risolvere quel problema, esegui chmod +x testscript.sh

35
Lypso345

Se lo script fa il suo lavoro (relativamente) bene, allora va bene. Il tuo problema è probabilmente una singola riga nel file che fa riferimento a un programma che non si trova sul percorso, non è installato, errato o simile.

Un modo è posizionare un set -x all'inizio del tuo script o eseguirlo con bash -x invece di solo bash - questo produrrà le righe prima di eseguirle e di solito devi solo guardare l'output del comando immediatamente prima dell'errore per vedere cosa sta causando il problema

Se, come dici tu, sono le righe vuote che causano i problemi, potresti voler controllare cosa è actaully in loro. Correre:

od -xcb testscript.sh

e assicurati che non ci siano personaggi divertenti "invisibili" come CTRL-M (ritorno a capo) che potresti ottenere usando un editor di tipo Windows.

10
paxdiablo

usa dos2unix sul tuo file di script. 

6
bash-o-logist

Se si dispone di Notepad ++ e si ottiene questo messaggio di errore .sh: "comando non trovato" O questo messaggio di errore autoconf "riga 615: ../../autoconf/bin/autom4te: Nessun file o directory con questo nome" .

Sul tuo Notepad ++, vai su Modifica -> Conversione EOL quindi seleziona Macinthos (CR) . Questo modificherà i tuoi file. Incoraggio anche a controllare tutti i file con questo comando, Perché presto si verificherà tale errore.

6
Juniar

per l'esecuzione è necessario fornire il percorso completo di tale ad esempio

/home/Manuel/mywrittenscript
5
Masood Moghini
5
Aminah Nuraini

Questo potrebbe essere banale e non correlato alla domanda dell'OP, ma lo ho spesso sbagliato all'inizio quando stavo imparando lo scripting

VAR_NAME = $(hostname)
echo "the hostname is ${VAR_NAME}"  

Questo produrrà una risposta 'comando non trovato'. Il modo corretto è eliminare gli spazi 

VAR_NAME=$(hostname)
4
altamont

Aveva lo stesso problema. Sfortunatamente 

dos2unix winfile.sh
bash: dos2unix: command not found

quindi l'ho fatto per convertire.

 awk '{ sub("\r$", ""); print }' winfile.sh > unixfile.sh

e poi 

bash unixfile.sh
3
Eugene Cuz

I problemi con gli script in esecuzione possono anche essere collegati a una cattiva formattazione di comandi su più righe, ad esempio se si dispone di un carattere di spazio bianco dopo l'interruzione di riga "\". Per esempio. Questo:

./run_me.sh \ 
--with-some parameter

(si noti lo spazio extra dopo "\") causerà problemi, ma quando si rimuove lo spazio, funzionerà perfettamente.

2
Marek Wysocki

Su Bash per Windows, ho provato a funzionare in modo errato

run_me.sh 

senza ./ all'inizio e ottenuto lo stesso errore.

Per le persone con Windows in background il modulo corretto sembra ridondante:

./run_me.sh
1

Mi sono imbattuto in questo oggi, copiando distrattamente il comando del dollaro Prompt $ (davanti a una stringa di comando) nello script.

0
CNSKnight

Avevo anche alcuni dei Cannot execute command. Tutto sembrava corretto, ma in effetti stavo avendo uno spazio &nbsp; non-breakable proprio davanti al mio comando che era ovviamente impossibile da individuare ad occhio nudo:

if [[ "true" ]]; then
  &nbsp;highlight --syntax js "var i = 0;"
fi

Che, in Vim, assomigliava a:

if [[ "true" ]]; then
  highlight --syntax js "var i = 0;"
fi

Solo dopo aver eseguito il correttore di script Bash shellcheck ho trovato il problema.

0

Aggiungi la directory corrente (.) A PATH per poter eseguire uno script, semplicemente digitando il suo nome, che risiede nella directory corrente:

PATH=.:$PATH
0
Mike Goethals

Si consiglia di aggiornare i file .bashrc e .bash_profile con alias per riconoscere il comando che si sta inserendo.

I file .bashrc e .bash_profile sono file nascosti che si trovano probabilmente nell'unità C: in cui si salvano i file del programma.

0
Kean Amaral