Załóżmy, że mam plik o nazwie filename123.txt
i to jest tak nazwany pojedynczy plik, i mogę to locate
zrobić za pomocą polecenia locate filename123
. I zwraca tylko ten plik.
Teraz chcę go otworzyć za pomocą vi
/ vim
. Ale nie chcę iść w to miejsce i wpisać vi
polecenia, a następnie nazwy pliku. Tutaj chcę, aby wynik locate filename123
był dołączony do polecenia vi. Jak mogę to zrobić? Próbowałem już:
locate filename123 | vi
Ale to nie działa. Ten błąd pojawia się w terminalu:
santosh@santosh:~$ locate filename123 | vi
Vim: Warning: Input is not from a terminal
Vim: Error reading input, exiting...
Vim: Finished.
command-line
terminal
vim
io-redirection
locate
Santosh Kumar
źródło
źródło
Odpowiedzi:
Możesz użyć
xargs
:Domyślnie
xargs
wykona jak najmniej instancji określonej komendy, przekazując jak najwięcej parametrów zgodnie z ARG_MAX systemu . Aby ograniczyć liczbę parametrów przekazywanych do wystąpieniavi
, użyj opcjixargs
„-n
.Aby obsługiwać nazwy plików zawierające spacje, użyj opcji
xargs
„-d
:Aby obsłużyć nazw plików zawierających znaki nowej linii używają
xargs
„-0
opcji razem zlocate
” s-0
opcja:(Jeśli
-0
nie jest dostępny na żadnym z nich, sprawdź--null
też, lub inny sposób określenia znaku\000
jako separatora).źródło
locate
polecenia jako dane wejściowe do vi. Vi, jak każdy inny program, oczekuje, że nazwa pliku lub plików będzie działać jako argument.Możesz użyć rozszerzenia poleceń:
Aby
vim
przeczytać jego standardowe wejście, możesz to zrobićvim -
, ale to po prostu da ci wynik,locate
którego ścieżkami są nazwy plików. Może to jednak działać, użycievim
gf
normalnego polecenia spowoduje otwarcie ścieżki, na której znajduje się kursor.Edytować
W przypadku nazw plików ze spacjami lepiej jest użyć
xargs
wspomnianej opcji lubvim
rozwiązania opisanego powyżej. Uwaga: aby wykonaćgf
pracę, musisz dodać miejsce doisfname
:Ta wskazówka i alternatywy są opisane tutaj .
Edytuj 2
Dodano cytaty i
head
jak sugeruje PeterO w komentarzach .źródło
another
ifile
:(.vi "$(locate filename123)"
... Aby upewnić się, że ma on tylko jedną nazwę pliku do obsługi:vi "$(locate filename123 |head -n1)"
Najprostszym sposobem jest podanie
locate
jako podstawienia powłoki , na przykład:Możesz również rozważyć użycie
find
zamiastlocate
przekazywania nazw plików do edycji, na przykład:W systemie Unix / OSX można używać
xargs
z-o
parametrem, takim jak:Lub w systemie Linux wypróbuj następujące obejście, używając:
Jeśli używasz różnych poleceń, użyj substytucji poleceń, aby to osiągnąć, na przykład:
Alternatywnie użyj GNU
parallel
zamiastxargs
wymusić alokację tty, na przykład:Uwaga:
parallel
w systemach Unix / OSX nie będzie działać, ponieważ ma inne parametry i nie obsługuje tty.Wiele innych popularnych komend zapewnia alokację pseudo-tty a także (jak
-t
wssh
), więc sprawdzić o pomoc.Inną sugestią byłoby użycie
vipe
(potok poleceń Vima) lub użycie następującego prostego skryptu:Związane z:
źródło