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 \-a
i 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 \-a
i 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 -a
dostaje 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 echo
i 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.c
jako tylko nieco wymyślony przykład. Każdy edytor wart swojej soli powinien mieć możliwość zapisania do pliku o nazwie, -myfile.c
jeśli o to poprosisz, ale kompilator C prawdopodobnie nie zrobi tego, co chcesz, gdy otrzyma taką listę opcji.
cc
polecenie podane powyżej przez Michaela, które ma -o
opcję 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 ./-a
Utworzy katalog nazwany -a
w 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, -rf
a 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 \-a
nie 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 -a
tak nie oznacza to nic specjalnego dla powłoki, nie mają one wpływu na to, jak zostanie ona przekazana mkdir
.
Jeśli chodzi o mkdir
to, 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