Jaka jest różnica w korzystaniu z „pliku dotykowego” i „> pliku” przy tworzeniu nowego pliku?

13

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.

Steve Deng Zishi
źródło
1
Ciekawi
1
Przekierowanie znajdziesz w instrukcji Bash. W wierszu polecenia wprowadź polecenie 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.
Paddy Landau

Odpowiedzi:

21

>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 > filenie 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.

touchto zewnętrzne polecenie, które tworzy plik lub aktualizuje znacznik czasu, jak już wiesz. Z touch, 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 > foobędzie działał zgodnie z oczekiwaniami. W Zsh domyślnie > foodziała podobnie cat > foo- Zsh czeka na wpisanie danych wejściowych.

muru
źródło
10
Kluczową kwestią jest to, że nie ma praktycznej różnicy między >> filei touch file, ale jeśli filenie istnieje, to istnieje duża różnica między nimi a > file(tym, że poprzednia zawartość filezostaną utracone). To plus niekonsekwentne zachowanie środków zsh touch filejest „najbezpieczniejszym” i dlatego należy je zapamiętać jako właściwą drogę do tego.
Monty Harder
1

Oto interesujące porównanie:

$ cat redirect.sh touch.sh sed.sh awk.sh cp.sh truncate.sh tee.sh vi.sh
> redirect.txt
touch touch.txt
sed 'w sed.txt' /dev/null
awk 'BEGIN {printf > "awk.txt"}'
cp /dev/null cp.txt
truncate -s0 truncate.txt
tee tee.txt </dev/null
vi -esc 'wq vi.txt'

Wynik:

$ strace dash redirect.sh | wc -l
387

$ strace dash touch.sh | wc -l
667

$ strace dash sed.sh | wc -l
698

$ strace dash awk.sh | wc -l
714

$ strace dash cp.sh | wc -l
786

$ strace dash truncate.sh | wc -l
1004

$ strace dash tee.sh | wc -l
1103

$ strace dash vi.sh | wc -l
1472
Steven Penny
źródło
1
Chociaż porównanie może być interesujące, tak naprawdę nie widzę tego, co chcesz, żebym tu zobaczył. Czy możesz wyjaśnić, o co ci chodzi? Sądzę, że są różne sposoby zapisywania rzeczy w plikach, ale wydaje mi się to trochę mylące. Może to być mój brak kawy.
m00am
@ m00am pokazano tutaj 8 różnych sposobów tworzenia pliku. stracema pokazywać wykonywane wywołania systemowe, a > file.txtmetoda 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ślnie stracezapisuje stderrstrumień, aw tej odpowiedzi Steven używa potoku tylko do odczytu stderr, więc jestem nieco zdezorientowany, jak policzył linie za pomocą |potoku, a nie|&
Sergiy Kolodyazhnyy
A na Ubuntu 16.04, używając |&, jak wspomniałem @Serg, dostaję około jednej piątej z tych tutaj ... z wyjątkiem viprzypadku, w którym mam mniej więcej tę samą wartość
muru
WSL? Woah ... Nie sądziłem WSL byłoby dodać , że wiele wywołań systemowych do tego co robi.
muru
@muru Cygwin - WSL nie jest jeszcze gotowy stackoverflow.com/a/40370009
Steven Penny