Zastanawiałem się, jak utworzyć plik o nazwie jako flaga, np. Jeśli chciałbym utworzyć folder o nazwie -a, jakie polecenia by to załatwiły?
Próbowałem mkdir '-a', mkdir \-ai nie działało. Jestem na Ubuntu.
Zastanawiałem się, jak utworzyć plik o nazwie jako flaga, np. Jeśli chciałbym utworzyć folder o nazwie -a, jakie polecenia by to załatwiły?
Próbowałem mkdir '-a', mkdir \-ai nie działało. Jestem na Ubuntu.
Odpowiedzi:
Wywołaj polecenie tak:
mkdir -- -a
Te --środki, które opcje zakończy po tym, więc -adostaje interpretować dosłownie, a nie jako opcja mkdir. Znajdziesz tę składnię nie tylko w mkdir, ale w dowolnym narzędziu zgodnym z POSIX, z wyjątkiem echoi test. Ze specyfikacji :
Argument - powinien zostać zaakceptowany jako separator wskazujący koniec opcji. Wszelkie poniższe argumenty należy traktować jako operandy, nawet jeśli zaczynają się znakiem „-”. Argumentu - nie należy używać jako opcji ani argumentu.
Użycie --jako zabezpieczenia jest zalecane w prawie każdej akcji, w której masz do czynienia z nazwami plików i chcesz się upewnić, że nie złamią one polecenia, np. Podczas przenoszenia plików w pętli możesz wywołać następujące, aby plik o nazwie -i„ t (in?) poprawnie przeanalizowane jako opcja:
mv -- "$f" new-"$f"
cc -o -myfile -Wall -myfile.cjako tylko nieco wymyślony przykład. Każdy edytor wart swojej soli powinien mieć możliwość zapisania do pliku o nazwie, -myfile.cjeśli o to poprosisz, ale kompilator C prawdopodobnie nie zrobi tego, co chcesz, gdy otrzyma taką listę opcji.
ccpolecenie podane powyżej przez Michaela, które ma -oopcję określenia pliku wyjściowego.
for f in ./*; do...zamiastfor f in *; do...
Najprostszym sposobem, który powinien działać z dowolnym rozsądnym programem, jest użycie względnej nazwy ścieżki przed -, np. mkdir ./-aUtworzy katalog nazwany -aw bieżącym katalogu roboczym.
Najczęstszym przykładem użycia tej „sztuczki” jest usunięcie pliku rozpoczynającego się od myślnika, abyś mógł to zrobić rm ./-a.
./jest zawsze dobrym pomysłem - wyobraź sobie, że utworzyłeś plik o nazwie, -rfa następnie zadzwoniłeś rm *.
--nie jest rozumiany przez wszystkie polecenia, tylko kilka)
--była bash, więc powinno działać dla wszystkich programów?
Powodem, mkdir '-a'lub mkdir \-anie jest praca, bo obie te metody (z wykorzystaniem cytatów lub odwrotne ukośniki) są stosowane, aby zapobiec skorupę (prawdopodobnie bash) od dając im żadnego specjalnego znaczenia. Ponieważ i -atak nie oznacza to nic specjalnego dla powłoki, nie mają one wpływu na to, jak zostanie ona przekazana mkdir.
Jeśli chodzi o mkdirto, otrzymuje listę argumentów z powłoki i nie może powiedzieć, czy umieścisz je w cudzysłowie, czy też wystąpił odwrotny ukośnik. Widzi tylko jeden argument -a. Dlatego potrzebujesz --wyjaśnienia w innych odpowiedziach.
Oprócz odpowiedzi z „slhck” istnieje jeszcze jedna sztuczka, która czasem działa:
Umieść nazwę pliku w dwóch zestawach (różnych) qoutes takich jak "'-a'"lub '"-a"'.
To, czy to zadziała, zależy od programu, ale jest to ostateczność, jeśli program nie obsługuje funkcji POSIX --.
Metoda POSIX jest zawsze preferowana, ponieważ jest w 100% niezawodna.
--do zakończenia przetwarzania opcji zakłada również, że nie potrzebujesz żadnych opcji śledzenia nazwy pliku, co nie zawsze ma miejsce.
'-a'lub "-a"przynajmniej w systemach typu BSD