Létrehoztam egy bash parancsfájlt, de amikor megpróbálom végrehajtani,
#!/bin/bash no such file or directory
Futtatnom kell a következő parancsot: bash script.sh
, hogy működjön.
Hogyan lehet kijavítja ezt?
Megjegyzések
Válasz
Ez a fajta üzenet általában hamis shebang-vonal, vagy egy plusz kocsi vissza a fenyő végén első sor vagy egy BOM annak elején.
Futtassa:
$ head -1 yourscript | od -c
és nézze meg, hogyan fejeződik be.
Ez téves:
0000000 # ! / b i n / b a s h \r \n
Ez is téves:
0000000 357 273 277 # ! / b i n / b a s h \n
Ez helyes:
0000000 # ! / b i n / b a s h \n
Használja a dos2unix
(vagy sed
, tr
, awk
, perl
, python
…) a szkript javításához, ha ez a probléma.
Itt van egy, amely eltávolítja mind a BOM-ot, mind a farok CR-ket:
sed -i "1s/^.*#//;s/\r$//" brokenScript
Ne feledje, hogy a parancsfájl futtatásához használt héj kissé befolyásolja a megjelenő hibaüzeneteket.
Íme három szkript, amelyek csak a nevüket mutatják (echo $0
), és a következő shebang sorokkal rendelkezik:
correctScript:
0000000 # ! / b i n / b a s h \n
scriptWithBom:
0000000 357 273 277 # ! / b i n / b a s h \n
scriptWithCRLF:
0000000 # ! / b i n / b a s h \r \n
A bash alatt a futtatással a következő üzenetek jelennek meg:
$ ./correctScript ./correctScript $ ./scriptWithCRLF bash: ./scriptWithCRLF: /bin/bash^M: bad interpreter: No such file or directory $ ./scriptWithBom ./scriptWithBom: line 1: #!/bin/bash: No such file or directory ./scriptWithBom
A bo futtatása A gus ones a tolmács explicit hívásával lehetővé teszi a CRLF parancsfájl problémamentes futtatását:
$ bash ./scriptWithCRLF ./scriptWithCRLF $ bash ./scriptWithBom ./scriptWithBom: line 1: #!/bin/bash: No such file or directory ./scriptWithBom
Az ksh
:
$ ./scriptWithCRLF ksh: ./scriptWithCRLF: not found [No such file or directory] $ ./scriptWithBom ./scriptWithBom[1]: #!/bin/bash: not found [No such file or directory] ./scriptWithBom
és dash
alatt:
$ ./scriptWithCRLF dash: 2: ./scriptWithCRLF: not found $ ./scriptWithBom ./scriptWithBom: 1: ./scriptWithBom: #!/bin/bash: not found ./scriptWithBom
Megjegyzések
- A probléma kiderítésének másik módja a
hexdump -C yourscript | head -n 1
. A javításhoz továbbra is ados2unix yourscript
-et használnám. - Ha CRLF-probléma lenne, nem látná ‘ egy
#!/bin/bash no such file or directory
hibaüzenet, mivel ‘ nincs ok arra, hogy bármi megpróbálná végrehajtani vagy megnyitni a#!/bin/bash
. ‘ s/bin/bash<CR>
mit hajtanak végre. - @StephaneChazelas Mivel a dos2unix megoldotta a problémát, nem kétséges nem volt ‘ ta CRLF probléma. A hibaüzenetet valószínűleg pontatlanul írták át.
-
dos2unix
szintén eltávolít egy UTF-8 BOM-ot. Az UTF-8 BOM megmagyarázhatta volna a hibaüzenetet. - Szomorú, hogy a Microsoft mennyire nem kompatibilis. Még olyan alapvető dolgokkal is, mint az ASCII.
Válasz
Ezt az UTF-ben lévő BOM is okozhatja. -8 szkript. Ha Windows-ban hozza létre a szkriptet, néha előfordul, hogy a fájl elején van némi szemét.
Megjegyzések
- A BOM könnyen eltávolítható az awk használatával, mint stackoverflow.com/questions/1068650/…
- Ne feledje, hogy a Visual Studio for A Mac egy BOM-ot fog beilleszteni.
Válasz
Valójában a bash szkript megfelelő shebangja ez:
#!/usr/bin/env bash
Mivel a freeBSD-ben a bash a /usr/local/bin/bash
megjegyzések
helyen található A
- ” right ” ilyen esetekben nehezen használható szó. Talán egy jobb kifejezés ” kevésbé lenne hajlamos a hibára “.
- Ez is szörnyű; az a feltételezés, hogy az / usr létezik, rossz az IMO. Haiku például nincs / usr.
Válasz
A vi segítségével mindkét probléma megoldható ha léteznek:
vi <your_file> :set ff=unix :set nobomb :wq
megjegyzések
- A válaszoknak a lehető legnagyobb mértékben önállónak kell lenniük. A kérdés nem említ két problémát; ha más válaszokra épít, legalább meg kell mondania, hogy mik azok. Még jobb, ha elmagyarázza, hogyan ez válaszolja meg a kérdést.
- Nagyon gyors javítás több Windows eszköz letöltése nélkül, köszönöm!
- @ G-Man Egyéb válaszok ezt már sokkal részletesebben említsd meg, mint amibe szeretnék belemenni.Nem kell megismételni, de ha ‘ nem fájdalmasan nyilvánvaló, akkor lehet WIndows sorvége és rejtett Windows BOM karaktere. Úgy gondolom, hogy sokan a válaszokat beolvasó emberek értékelik a rövidséget ahelyett, hogy önállóak lennének, különösen akkor, ha a többi válasz sokkal részletesebb.
Válasz
Ha nincs dos2unix, akkor ezzel megoldhatja a problémát.
cp script _p4 && tr -d "\r" < _p4 > script && rm _p4
Válasz
Byte-order Mark (BOM)
Ennek oka lehet egy BOM. A Wikipédiából a BOM egy
A bájt sorrendjel (BOM) egy Unicode karakter, U + FEFF bájt sorrendjel (BOM) , amelynek varázsszámként való megjelenése a szövegfolyam kezdetén több dolgot is jelezhet a szöveget fogyasztó programnak
Sajnos nem jelez semmit a she-bang sort kezelő Linux kernelnek. A file
használatával ellenőrizheti, hogy van-e BOM. ,
file /tmp/foo /tmp/foo: UTF-8 Unicode (with BOM) text
Vagy hexdump az első néhány karaktert, és lásd: , ha manuálisan illeszkednek valamelyik BOM-karakterhez
A BOM-karaktereket lecsupaszíthatja, ha ismeri őket így ,
sed -i "1 s/^\xef\xbb\xbf//" *.txt
válasz
Nekem az volt a problémám, hogy véletlenül rossz bash-t adtam hozzá futtatható a PATH
fájlba, és mivel a szkriptemben a rugalmasabb #!/usr/bin/env bash
shebang-ot használták (az első bash futtatható fájl elérése az útvonalról).
command -v bash /cygdrive/c/Program Files/Git/bin//bash
Telepítettem a GIT for Windows rendszert, hogy a cygwin
fájlban működjön együtt a Windows GIT GUI -ival (nem működött a natív cygwin …). Ezt most úgy oldottam meg, hogy átváltottam a #!/bin/bash
sávsávra, és eltávolítottam a Windows GIT-jét a PATH
fájlból.
Válasz
Próbálja ki #!/bin/bash
Második dolog: find / -name bash
Harmadik dolog: ls -al /bin/bash
megjegyzés
- Vagy csak
which bash
. Tudjuk, hogy ‘ talál ilyet, mert ‘ dolgozik abash script.sh
. - Igaz. És mint említettük, létezik egy sokkal hordozhatóbb / usr / bin / env módszer, amellyel egy program megkeresheti a bash-t (vagy más tolmácsot) az Ön számára. Nem kell hardkódot kódolni.
#!/usr/bin/env bash
-t is használt a#!/bin/bash
és itt is keres …