Jestem nowy w Linuksie. Kiedy tworzę nowy plik .gitignore w bieżącym katalogu za pomocą bash, przekonałem się, że mogę:
> .gitignore
lub
touch .gitignore
Wygląda na to, że robią to samo. Kiedy sprawdzam instrukcję touch
, pojawia się komunikat o zmianie znacznika czasu dla bieżącego pliku, ale nie ma instrukcji dla >
. Czy ktoś może więc wyjaśnić, co można >
zrobić i czy jest jakaś różnica w używaniu tych dwóch poleceń w tym kontekście? Dzięki.
command-line
Steve Deng Zishi
źródło
źródło
man bash
. Jest to długi dokument i jego zrozumienie zajmie dni, a nawet tygodnie, ale warto go przejrzeć, jeśli chcesz dokładnie nauczyć się języka Bash.Odpowiedzi:
>
jest operatorem przekierowania powłoki. Zobacz Jaka jest różnica między „>” a „>>” w poleceniu powłoki? i Kiedy powinienem używać <lub <() lub << i> lub> ()? Służy przede wszystkim do przekierowania wyjścia polecenia do pliku. Jeśli plik nie istnieje, powłoka go tworzy. Jeśli istnieje, powłoka ją obcina (opróżnia). Po prostu> file
nie ma polecenia, więc powłoka tworzy plik, ale do niego nie wysyłane są żadne dane wyjściowe, więc efektem netto jest utworzenie pustego pliku lub opróżnienie istniejącego pliku.touch
to zewnętrzne polecenie, które tworzy plik lub aktualizuje znacznik czasu, jak już wiesz. Ztouch
, zawartość pliku nie zostanie utracona, jeśli istnieje, w przeciwieństwie do>
.Zachowanie
>
zależy od powłoki. W bashu, desce rozdzielczej i większości powłok> foo
będzie działał zgodnie z oczekiwaniami. W Zsh domyślnie> foo
działa podobniecat > foo
- Zsh czeka na wpisanie danych wejściowych.źródło
>> file
itouch file
, ale jeślifile
nie istnieje, to istnieje duża różnica między nimi a> file
(tym, że poprzednia zawartośćfile
zostaną utracone). To plus niekonsekwentne zachowanie środków zshtouch file
jest „najbezpieczniejszym” i dlatego należy je zapamiętać jako właściwą drogę do tego.Oto interesujące porównanie:
Wynik:
źródło
strace
ma pokazywać wykonywane wywołania systemowe, a> file.txt
metoda pokazuje, że jest najmniej wykonanych wywołań systemowych, co nie jest wcale tak zaskakujące - im bardziej złożone jest narzędzie, tym bardziej złożone są jego wywołania systemowe. Problem z pokazanymi przykładami polega jednak na tym, że domyślniestrace
zapisujestderr
strumień, aw tej odpowiedzi Steven używa potoku tylko do odczytustderr
, więc jestem nieco zdezorientowany, jak policzył linie za pomocą|
potoku, a nie|&
|&
, jak wspomniałem @Serg, dostaję około jednej piątej z tych tutaj ... z wyjątkiemvi
przypadku, w którym mam mniej więcej tę samą wartość