| Termin | Definicja |
|---|---|
| Problemy z przekazywaniem argumentów do skryptu | Problemy z przekazywaniem argumentów do skryptu wskazują na niepoprawną obsługę cudzysłowów lub spacji w wywołaniu z wiersza poleceń. Problemy z przekazywaniem argumentów do skryptu: na czym polega zjawiskoProblemy z przekazywaniem argumentów do skryptu pojawiają się wtedy, gdy program uruchamiany z wiersza poleceń otrzymuje dane w innej postaci, niż zakładano podczas tworzenia skryptu. Dotyczy to zarówno prostych plików wsadowych, jak i skryptów PowerShell, Bash, Pythona, JavaScript uruchamianego poza przeglądarką oraz narzędzi używanych do automatyzacji pracy systemu. Sam skrypt może być napisany poprawnie, a mimo to nie wykonać zadania, ponieważ argument został podzielony na kilka części, potraktowany jako przełącznik albo odczytany jako pusty tekst. Argumentem może być nazwa pliku, ścieżka do katalogu, identyfikator, parametr sterujący działaniem programu lub dowolny tekst przekazywany do procedury. W wierszu poleceń znaczenie mają spacje, cudzysłowy, apostrofy, nawiasy, znaki specjalne oraz kolejność poszczególnych elementów. Z tego powodu polecenie, które wygląda podobnie dla człowieka, dla interpretera może oznaczać zupełnie inne wywołanie. Szczególne trudności występują przy ścieżkach zawierających spacje, nazwach plików z polskimi znakami oraz wartościach pobieranych z innych poleceń. Warto rozdzielić dwa poziomy działania. Najpierw system powłoki analizuje wpisane polecenie i decyduje, gdzie kończy się nazwa programu, a gdzie zaczynają się argumenty. Następnie sam skrypt odczytuje otrzymane wartości i przypisuje je do zmiennych lub pozycji na liście parametrów. Błąd może powstać na każdym z tych etapów. Komunikat wskazujący na brak pliku nie zawsze oznacza uszkodzenie pliku. Przyczyną może być przekazanie jedynie pierwszego fragmentu ścieżki. Problemy z przekazywaniem argumentów do skryptu a różne powłokiSposób interpretowania argumentów zależy od użytej powłoki. W systemie Windows spotyka się między innymi klasyczny wiersz poleceń oraz PowerShell, natomiast w systemach Linux i macOS często stosuje się Bash, Zsh lub inne powłoki zgodne z podobnymi regułami. Nie należy zakładać, że zapis działający w jednym środowisku zachowa się identycznie w innym. Różnice mogą dotyczyć cudzysłowów, znaków ucieczki, rozwijania zmiennych, przekierowań oraz sposobu przekazywania pustych wartości. Przykładowo ścieżka Istotne jest także odróżnienie cudzysłowu podwójnego od apostrofu. W wielu powłokach cudzysłów podwójny pozwala na rozwijanie zmiennych, natomiast apostrof zachowuje tekst bardziej dosłownie. W PowerShell dodatkowe znaczenie mają znaki takie jak backtick, nawiasy oraz operator przekazywania potoku. W Bashu znaczenie może zmienić znak dolara, gwiazdka lub średnik. Dlatego kopiowanie gotowego polecenia z innego środowiska bez sprawdzenia składni często prowadzi do niejasnych błędów. Warto również uwzględnić różnicę między argumentem pozycyjnym a nazwanym. Argument pozycyjny jest rozpoznawany na podstawie miejsca, na przykład pierwszy element oznacza plik wejściowy, a drugi katalog docelowy. Argument nazwany ma własny przełącznik, taki jak Typowe problemy z przekazywaniem argumentów do skryptuJednym z najczęstszych przypadków jest utrata części argumentu zawierającego spację. Skrypt może wtedy zgłaszać, że nie znaleziono pliku, katalogu lub polecenia, choć wskazany zasób istnieje. Drugim częstym problemem jest niezamierzone usunięcie cudzysłowów przez kolejną warstwę uruchamiającą. Jeżeli skrypt jest wywoływany z innego skryptu, programu, skrótu albo harmonogramu zadań, argument może być analizowany kilkukrotnie. Cudzysłowy potrzebne na pierwszym poziomie mogą nie dotrzeć do poziomu końcowego. Problemy sprawiają także wartości puste. W niektórych zapisach brak argumentu, pusty tekst oraz tekst zawierający pojedynczą spację są trzema różnymi przypadkami. Jeżeli skrypt nie sprawdza liczby otrzymanych argumentów, może próbować użyć nieistniejącej wartości jako nazwy pliku lub parametru. Objawem bywa komunikat o nieprawidłowym indeksie, błędnej ścieżce albo nieznanym przełączniku. Do osobnej grupy należą znaki specjalne. Nawiasy, ampersand, pionowa kreska, znak mniejszości, znak większości, średnik, gwiazdka i znak zapytania mogą mieć dla powłoki znaczenie sterujące. Jeśli mają zostać przekazane jako zwykły tekst, muszą zostać odpowiednio ujęte lub zabezpieczone. Dotyczy to na przykład haseł testowych, wzorców wyszukiwania, wyrażeń regularnych oraz nazw zawierających nawiasy. W systemach z różnymi kodowaniami mogą pojawić się kłopoty z polskimi znakami i innymi znakami spoza podstawowego alfabetu. Argument może zostać przekazany poprawnie, ale odczytany nieprawidłowo przez skrypt albo zapisany w innym kodowaniu przez program pośredni. W efekcie ścieżka lub wyszukiwany tekst wygląda na zmieniony. Należy wtedy sprawdzić kodowanie pliku skryptu, ustawienia terminala oraz sposób odczytu danych przez używany język. Czasem przyczyną nie jest sama składnia, lecz bieżący katalog roboczy. Ścieżka względna, taka jak Praktyczne wskazówki przy problemach z przekazywaniem argumentów do skryptuNajpierw należy sprawdzić, co skrypt rzeczywiście otrzymuje. Dobrym rozwiązaniem jest tymczasowe wyświetlenie liczby argumentów oraz ich wartości, z wyraźnym oznaczeniem początku i końca każdego elementu. Pozwala to odróżnić brak argumentu od argumentu zawierającego spację lub niewidoczny znak. W zależności od języka można wykorzystać odpowiednią pętlę po wszystkich argumentach albo funkcję wypisującą reprezentację tekstową wartości. Przy testowaniu należy używać prostych danych, a następnie stopniowo dodawać trudniejsze przypadki. Warto sprawdzić osobno zwykłą nazwę bez spacji, nazwę ze spacją, ścieżkę względną, ścieżkę bezwzględną, tekst zawierający polskie znaki, pustą wartość oraz znaki specjalne. Takie podejście ułatwia ustalenie, na którym etapie pojawia się zmiana. Bezpieczniej jest umieszczać całą ścieżkę lub cały tekst w odpowiednich cudzysłowach, zamiast otaczać nimi tylko wybrane fragmenty. Należy jednak stosować składnię właściwą dla konkretnej powłoki. Nadmiarowe cudzysłowy również mogą być błędem, jeśli skrypt oczekuje czystej wartości i sam otrzyma znaki cudzysłowu jako część argumentu. Przy złożonych wywołaniach przydatne bywa zapisanie argumentów w zmiennych, a następnie przekazanie tych zmiennych zgodnie z zasadami danej powłoki. Warto unikać ręcznego sklejania poleceń z niezweryfikowanych fragmentów tekstu. Jeżeli dane pochodzą od użytkownika lub z pliku, powinny zostać sprawdzone pod kątem pustych wartości, nieprawidłowych znaków i oczekiwanego formatu. W przypadku nazw plików przydatna jest walidacja istnienia zasobu oraz jednoznaczne rozdzielenie ścieżki wejściowej od parametrów sterujących. Ogranicza to ryzyko, że zwykły tekst zostanie zinterpretowany jako polecenie albo przełącznik. Przydatne jest także dodanie krótkiej instrukcji użycia. Powinna opisywać kolejność argumentów, wskazywać, które wartości są wymagane, oraz pokazywać poprawne przykłady dla ścieżek zawierających spacje. Skrypt powinien kończyć działanie czytelnym komunikatem, gdy otrzyma zbyt mało argumentów lub nieznany przełącznik. Dzięki temu diagnoza nie wymaga zgadywania, jakie dane były oczekiwane. Kiedy zgłosić problemy z przekazywaniem argumentów do skryptuPomoc serwisowa jest wskazana, gdy polecenie działa tylko w jednym miejscu, skrypt losowo odrzuca ścieżki, po zmianie nazwy folderu pojawiają się błędy albo problem występuje wyłącznie przy uruchamianiu z programu graficznego, skrótu lub zadania automatycznego. Warto zgłosić również sytuację, w której komunikat błędu nie odpowiada wykonywanej czynności, a sam skrypt modyfikuje pliki, kopiuje dane lub wykonuje kilka operacji po kolei. W takich przypadkach potrzebne może być prześledzenie całego łańcucha wywołania, a nie tylko poprawienie jednego cudzysłowu. Przed przekazaniem zgłoszenia dobrze przygotować treść polecenia, nazwę używanej powłoki, przykładowe argumenty oraz dokładny komunikat błędu. Nie należy udostępniać haseł ani poufnych danych. Wystarczą zastępcze nazwy plików, o ile zachowują spacje, znaki specjalne i podobną długość. Pomocne jest także wskazanie, czy problem występuje przy każdym pliku, czy tylko przy określonych nazwach. W Warszawie analizę takich usterek można zlecić firmie Warszawskie Pogotowie Komputerowe 24/7. W ramach zgłoszenia można opisać sposób uruchamiania skryptu oraz objawy, a następnie ustalić zakres sprawdzenia konfiguracji systemu, powłoki i plików pomocniczych. Szczególnej uwagi wymagają przypadki, w których błędne argumenty prowadzą do pomijania plików, zapisywania danych w nieoczekiwanym miejscu lub wykonywania operacji na niewłaściwym zasobie. |