/: to problem z katalogiem w bash

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.

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *