#! / bin / bash – nincs ilyen fájl vagy könyvtár

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

  • Ez a probléma most a cygwin alatt van, és egy szkript, amire esküszöm, esküszöm, már problémamentesen fut. Ellenőriztem az összes választ, de úgy tűnik, egyik sem felel meg. Más kérdések és válaszok 32/64 bites problémákat is említettek, de a shell szkripteknél ez kizárható, igaz?
  • Megtalálta az okot, és részleteket adott az új anwer unix.stackexchange.com/a/450389/62636 , ha valaki #!/usr/bin/env bash -t is használt a #!/bin/bash és itt is keres …

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 a dos2unix 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

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 a bash 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.

Vélemény, hozzászólás?

Az email címet nem tesszük közzé. A kötelező mezőket * karakterrel jelöltük