it-swarm-eu.dev

#! / bin / bash - žádný takový soubor nebo adresář

Vytvořil jsem bash skript, ale když se ho pokusím spustit, dostanu

#!/bin/bash no such file or directory

Musím spustit příkaz: bash script.sh aby to fungovalo.

Jak to mohu opravit?

76

Tento druh zprávy je obvykle způsoben falešnou linií Shebangu, buď dodatečným návratem vozíku na konci prvního řádku nebo kusovníkem na začátku zprávy.

Běh:

$ head -1 yourscript | od -c

a uvidíte, jak to končí.

To je špatně:

0000000   #   !   /   b   i   n   /   b   a   s   h  \r  \n

To je také špatné:

0000000 357 273 277   #   !   /   b   i   n   /   b   a   s   h  \n

Toto je správně:

0000000   #   !   /   b   i   n   /   b   a   s   h  \n

Použijte dos2unix (nebo sed, tr, awk, Perl, python…)) opravte skript, pokud se jedná o problém.

Tady je ten, který odstraní oba kusovníky i zbytkové CR:

sed -i '1s/^.*#//;s/\r$//' brokenScript

Zde jsou tři skripty, které zobrazují pouze jejich jméno (echo $0) a mající následující příslušné linie Shebang:

správný skript:

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

V rámci bash jejich spuštění zobrazí tyto zprávy:

$ ./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

Spuštění falešných programů explicitním voláním tlumočníka umožňuje spuštění skriptu CRLF bez problémů:

$ bash ./scriptWithCRLF
./scriptWithCRLF
$ bash ./scriptWithBom
./scriptWithBom: line 1: #!/bin/bash: No such file or directory
./scriptWithBom

Zde je chování pozorované pod ksh:

$ ./scriptWithCRLF
ksh: ./scriptWithCRLF: not found [No such file or directory]
$ ./scriptWithBom
./scriptWithBom[1]: #!/bin/bash: not found [No such file or directory]
./scriptWithBom

a pod dash:

$ ./scriptWithCRLF
dash: 2: ./scriptWithCRLF: not found
$ ./scriptWithBom
./scriptWithBom: 1: ./scriptWithBom: #!/bin/bash: not found
./scriptWithBom
108
jlliagre

To může být také způsobeno kusovníkem ve skriptu UTF-8. Pokud v systému Windows vytvoříte skript, někdy se na začátku souboru objeví nějaké nevyžádané.

17
teknopaul

Pomocí vi můžete opravit oba problémy, pokud existují:

vi <your_file>
:set ff=unix
:set nobomb
:wq
10
cwash

Ve skutečnosti je správný Shebang pro bash skript následující:

#!/usr/bin/env bash

Protože v freeBSD je bash umístěn v /usr/local/bin/bash

10
moebius_eye

Pokud nemáte dos2unix, je to způsob, jak tento problém vyřešit.

cp script _p4 && tr -d '\r' < _p4 > script && rm _p4
4
cokedude

Byte-order Mark (BOM)

To by mohlo být způsobeno kusovníkem. Z Wikipedie je kusovník

Bajtová objednávková značka (BOM) je znak Unicode, bajtová objednávková značka U + FEFF (BOM), jejíž vzhled jako magické číslo na začátku textového toku může signalizovat programu, který spotřebovává text, několik věcí

Bohužel nesignalizuje nic do linuxového jádra, které zpracovává linii ona-bang. Můžete si ověřit, že máte kusovník pomocí file,

file /tmp/foo 
/tmp/foo: UTF-8 Unicode (with BOM) text

Nebo můžete hexdump prvních pár znaků a vidět pokud se shodují s některými znaky BOM ručně

Jakmile tyto znaky znáte, můžete je odstranit.

sed -i '1 s/^\xef\xbb\xbf//' *.txt
3
Fabien Haddadi

Měl jsem problém tím, že jsem omylem přidal nesprávný spustitelný bash spustitelný soubor do PATH a protože v mém skriptu byl flexibilnější #!/usr/bin/env bash Byl použit Shebang (vezměte první spustitelný bash z cesty).

command -v bash
/cygdrive/c/Program Files/Git/bin//bash

Nainstaloval jsem GIT pro Windows, abych pracoval v cygwin společně s GUI Windows GIT (nepracoval s cygwin native git ...). Vyřešil jsem to nyní přepnutím na #!/bin/bash sheband a odebrání GIT pro Windows z PATH.

0
jan