Sunt destul de nou în scripturile bash și merg destul de bine, dar am întâmpinat o problemă.
Încerc să creez un script care folosește o linie directă (/), totuși primesc în continuare mesajul de eroare /: is a directory.
Deci, practic, ce Am nevoie să trec comanda test/(hello)
la un program din terminal. Așa că am adăugat backslash-uri pentru a-l face să funcționeze: test\/\(hello\)
, totuși , Primesc această eroare. Ce este în neregulă aici?
Comentarii
- unde folosește scriptul slashul direct? Se pare că transmiteți cu succes argumentul la comandă / script, dar că există o eroare în script. Ne puteți da un exemplu mai detaliat? De asemenea, ' nu menționează un număr de linie sau ceva?
Răspunde
Acest lucru ar trebui să se întâmple numai dacă nu treceți un comanda înainte de argument. Trebuie să invocați astfel de comenzi:
command [args ...]
Dacă o invocați astfel, va funcționa.
$ echo test/\(hello\) test/(hello)
Pentru înregistrare, este „în general mult mai ușor (și mult mai ușor de citit) să citiți argumente în loc să scăpați de toate metacaractere. Puteți face acest lucru folosind "
și "
(există informații bune despre acest aici ).
Comentarii
- Votat în sus. Shell-ul va interpreta textul separat numai prin bare ca directoare, nu comenzi / argumente. Slash-ul înainte poate fi utilizat în argumentele, de exemplu, scripturilor Perl (necesită configurarea
Getopt::Long
sau rularea propriului), dar necesită totuși spațiul dintre comandă și argumente – din nou, aceasta este o cerință de shell.
Răspunde
Dacă trebuie să treci șirul exact test/(hello)
la un program, puneți-l între ghilimele simple:
someprogram "test/(hello)"
Fiecare caracter este interpretat literal între ghilimele simple, cu excepția caracterului ghilimelelor unice în sine. Dacă aveți nevoie de un singur caracter de ghilimel în șir, treceți-l ca "\""
(sfârșit șir literal, citat caracterul următor, ghilimel singur interpretat literal, începe șir literal).
echo "Lasciate ogne speranza, voi ch"\""entrate"
Acest lucru nu are legătură cu mesajul de eroare afișat aici. /: is a directory
înseamnă că ați încercat să executați /
ca program. Probabil că există un loc în care ați încercat să scrieți calea completă către un program, dar ați lăsat un spațiu suplimentar, ca în
/ path/to/program
Pot exista alte caractere de punctuație acest lucru mai puțin evident sau caracterele de control din acel mesaj. Pentru a facilita depanarea, puneți set -x
pe a doua linie a scriptului, imediat după linia inițială #!
, astfel încât shell-ul să imprime un urmă a fiecărei linii pe care o execută.