Jestem całkiem nowy w skryptach basha i radzę sobie całkiem dobrze, ale napotkałem problem.
Próbuję utworzyć skrypt, który używa ukośnika (/), jednak ciągle otrzymuję komunikat o błędzie /: is a directory.
Więc w zasadzie co Muszę przekazać polecenie test/(hello)
do programu w terminalu. Dodałem więc ukośniki odwrotne, aby działało: test\/\(hello\)
, Pojawia się ten błąd. Co jest nie tak?
Komentarze
- gdzie skrypt używa ukośnika? Wygląda na to, że pomyślnie przekazujesz argument do polecenia / skryptu, ale w skrypcie jest błąd. Czy możesz podać nam bardziej szczegółowy przykład? czy nie ' nie zawiera numeru linii czy czegoś takiego?
Odpowiedź
Powinno się to zdarzyć tylko wtedy, gdy nie zdasz egzaminu polecenie przed argumentem. Musisz wywołać takie polecenia:
command [args ...]
Jeśli wywołasz to w ten sposób, zadziała.
$ echo test/\(hello\) test/(hello)
Ogólnie rzecz biorąc, znacznie łatwiej jest (i znacznie bardziej czytelnie) cytować argumenty zamiast uciekać przed wszystkimi metaznakami. Możesz to zrobić za pomocą "
i "
(dobre informacje na ten temat znajdują się tutaj ).
Komentarze
- Głos za zgodą. Powłoka zinterpretuje tekst oddzielony jedynie ukośnikami jako katalogi, a nie polecenia / argumenty. Ukośnik może być używany w argumentach, na przykład skryptów Perla (wymaga skonfigurowania
Getopt::Long
lub przesunięcia własnego), ale nadal wymaga spacji między poleceniem a argumentami – znowu, to jest wymóg powłoki.
Odpowiedź
Jeśli chcesz przekazać dokładny ciąg test/(hello)
do programu, umieść go między pojedynczymi cudzysłowami:
someprogram "test/(hello)"
Każdy znak jest interpretowany dosłownie między pojedynczymi cudzysłowami, z wyjątkiem pojedynczego cudzysłowu samo. Jeśli potrzebujesz pojedynczego cudzysłowu w ciągu, przekaż go jako "\""
(koniec literału, cytat następny znak, pojedynczy cudzysłów interpretowany dosłownie, początek literału).
echo "Lasciate ogne speranza, voi ch"\""entrate"
Nie ma to związku z wyświetlanym tutaj komunikatem o błędzie. /: is a directory
oznacza, że próbujesz wykonać /
jako program. Prawdopodobnie istnieje miejsce, w którym próbowałeś napisać pełną ścieżkę do programu, ale zostawiłeś dodatkową spację, na przykład
/ path/to/program
Mogą występować inne znaki interpunkcyjne mniej oczywistych lub kontrolnych znaków w tej wiadomości. Aby ułatwić debugowanie, umieść set -x
w drugiej linii skryptu, tuż po początkowej linii #!
, tak aby powłoka wydrukowała ślad każdej wykonywanej linii.