Lo script Bash stampa "Comando non trovato" su righe vuote


111

Ogni volta che eseguo uno script utilizzando bash scriptname.shdalla riga di comando in Debian, ottengo Command Not founde quindi il risultato dello script.

Lo script funziona ma c'è sempre Command Not Foundun'istruzione stampata sullo schermo per ogni riga vuota. Ogni riga vuota risulta in un comando non trovato.

Sto eseguendo lo script dalla /varcartella.

Ecco lo script:

#!/bin/bash

echo Hello World

Lo eseguo digitando quanto segue:

bash testscript.sh

Perché questo dovrebbe accadere?


Scherzi a parte, la rete è piena di tali lamentele. Shell è un interprete molto debole e zoppo. Poco qua e là e fallisce. Devi guardare anche tutti gli spazi bianchi nel copione. Il mio script non funzionava a causa del carattere di avanzamento riga invisibile. Probabilmente questo è solo un linguaggio di scripting in cui contano gli spazi bianchi!
Atul

1
Utilizzare bash -x scriptname.shper tracciare l'errore. - Nel mio caso si trattava di un file sh salvato in Windows con VSCode e terminazioni di riga come "CRLF". In VSCode nell'angolo in basso a destra è possibile modificare il terminatore di riga da "CRLF" a "LF". Caricato questo file e potrei eseguirlo finalmente con bash scriptname.sh.
Kai Noack il

Questo è sicuramente un duplicato di stackoverflow.com/questions/39527571/… ma molte risposte qui spiegano una serie di altre situazioni in cui ottieni "comando non trovato" per altri motivi. Si consiglia ai visitatori di leggere tutte le risposte se il problema non riguarda specificamente le righe vuote.
tripleee

Risposte:


161

Assicurati che la tua prima riga sia:

#!/bin/bash

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


Prova a correre:

dos2unix script.sh

Ciò convertirà le terminazioni di riga, ecc.Da Windows al formato unix. cioè rimuove \ r (CR) dalle terminazioni di riga per cambiarle da \r\n (CR+LF)a \n (LF).

Maggiori dettagli sul dos2unixcomando (pagina man)


Un altro modo per sapere 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 \rcarattere nel file.


Probabilmente non è necessario poiché lo sta eseguendo direttamente con bash scriptname.sh(ma è comunque una buona pratica, ovviamente).
paxdiablo

1
Ciao #! / Bin / bash è la prima riga del mio script
David

1
@chown - Ho avuto lo stesso problema su Mac. Mi sono imbattuto in questo post. Non sono sicuro se abbia aiutato o meno l'OP. Ma la tua soluzione mi ha aiutato.
Prashant

1
Grazie. Questo era esattamente il problema che stavo affrontando. Questa risposta ha funzionato.
slayedbylucifer il

5
Come puoi scrivere una risposta a una domanda di programmazione mentre guidi?
Omar Tariq

61

Puoi usarlo bash -x scriptname.shper rintracciarlo.


47

Ho anche riscontrato un problema simile. Il problema sembra essere le autorizzazioni. Se fai un ls -l, potresti essere in grado di identificare che il tuo file potrebbe NON avere il bit di esecuzione attivato. Ciò NON consentirà l'esecuzione dello script. :)

Come ha aggiunto @artooro nel commento:

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


4
Per risolvere il problema, eseguichmod +x testscript.sh
artooro

Questa è stata la risposta che ha funzionato per me, mi è sempre stato detto che non avevo il permesso, quindi l'ho soppressa e mi è stato detto che il comando non è stato trovato. Non ho pensato di controllare le autorizzazioni.
DiamondDrake

1
Grazie Lypso345, questo ha risolto il problema che stavo avendo.
ammills01

chmod 777 testscript.sh FTW
GeneCode

16

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

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

Questo produrrà la risposta "comando non trovato". Il modo corretto è eliminare gli spazi

VAR_NAME=$(hostname)

11

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

Un modo è posizionare un set -xall'inizio del tuo script o eseguirlo con bash -xinvece di solo bash- questo produrrà le linee 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 a causare i problemi, potresti voler controllare cosa c'è esattamente in esse. Correre:

od -xcb testscript.sh

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


+1 per il comando "od"! Bello, non lo sapevo! Grazie!
chown

11

Su Bash per Windows ho provato a eseguire in modo errato

run_me.sh 

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

Per le persone con uno sfondo di Windows, il modulo corretto sembra ridondante:

./run_me.sh



6

per eseguirlo devi fornire il percorso completo di quello, ad esempio

/home/Manuel/mywrittenscript

In effetti, la shell non si preoccupa affatto delle estensioni dei file. Non sono sicuro che questo meriti di essere pubblicato come risposta separata.
tripleee

ovviamente nel file system linux, contrariamente alle estensioni di Windows, vengono utilizzate solo come parte del nome e non dicono nulla sul contenuto del file, non devo dire nel mio caso vincoli.
Masood Moghini

6

Se hai Notepad ++ e ricevi questo messaggio di errore .sh: "comando non trovato" o questo messaggio di errore di autoconf "riga 615: ../../autoconf/bin/autom4te: nessun file o directory di questo tipo" .

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


Grazie per questo. Per il mio caso stavo eseguendo script sulla distribuzione Linux busybox. Ha avuto lo stesso errore "non trovato" in tutte le righe vuote nei miei script. ha anche avuto problemi con l'istruzione if / else. cambiando EOL in Notepad ++ in Unix lo ha risolto.
GeneCode

4

Ho avuto 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

2

Problemi con l'esecuzione di script possono anche essere collegati a una formattazione errata dei comandi su più righe, ad esempio se si dispone di uno spazio vuoto dopo l'interruzione di riga "\". Ad esempio questo:

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

(si prega di notare che lo spazio extra dopo "\") causerà problemi, ma quando rimuovi quello spazio, funzionerà perfettamente.


0

Stavo anche avendo alcuni dei file Cannot execute command. Tutto sembrava corretto, ma in realtà avevo uno spazio infrangibile &nbsp;proprio prima del mio comando che era ovviamente impossibile da individuare a occhio nudo:

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

Che, in Vim, sembrava:

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

Solo dopo aver eseguito il controllo degli script Bash shellcheckho trovato il problema.


shellcheckè disponibile on-line, anche se ovviamente devi copiare + incollare il tuo script esattamente in modo che sia di aiuto. shellcheck.net
tripleee

0

Mi sono imbattuto in questo oggi, copiando distrattamente il prompt dei comandi del dollaro $(prima di una stringa di comando) nello script.


-1

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

PATH=.:$PATH

1
Questa è considerata una vulnerabilità di sicurezza. NON AGGIUNGERE .AL TUO PERCORSO.
gniourf_gniourf

Spiegazione del motivo per cui questa "risposta" è una cattiva idea: superuser.com/questions/156582/…
jmng

-1

Potresti voler aggiornare i tuoi file .bashrc e .bash_profile con alias per riconoscere il comando che stai immettendo.

I file .bashrc e .bash_profile sono file nascosti che probabilmente si trovano sull'unità C: dove salvi i file di programma.

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.