Chciałbym programowo umieścić pewien fragment tekstu w buforze bash wiersza poleceń, przeczytać do edycji i użyć jako polecenia.
Z niecierpliwością czekam na coś podobnego do read -i
poleceń.
-i text
Jeśli do odczytu linii używany jest readline, tekst jest umieszczany w buforze edycji przed rozpoczęciem edycji.
Edycja : Programowo mam na myśli, że chcę napisać to w skrypcie , uruchomić skrypt i przygotować bufor poleceń lub zmodyfikować historię poleceń (jak sugerowały niektóre pytania).
screen
może to dla Ciebie zrobić.Odpowiedzi:
Znalazłem hacky sposób na zrobienie tego na stronie przykładów FZF . Działa to z bash 4.3 i perl 5.18:
Wypisuje polecenie na standardowe wyjście, ale kopiuje je również do bufora poleceń. Istnieje również przykład na połączonej stronie, jeśli chcesz wykonać polecenie bezpośrednio.
źródło
&TIOCSTI
to ładniejszy niż nieco0x5412
zbyt. Warto zauważyć, że brzmi to tak, jakby niektóre platformy (np. OpenBSD ) wyłączały TIOCSTI. Myślę, że to oznacza, że zarówno to podejście, jak i Zshprint -z
nie zadziałały.Jeśli jest to funkcja, której zamierzasz użyć w powiązaniu readline,
bind -x
możesz ją zmodyfikowaćREADLINE_LINE
. ( Przykład )Poza powiązaniem readline, możesz wcisnąć do historii fałszywe polecenie za pomocą
history -s
.źródło
history -s 'foo'
w skrypcie, historia rozpoczęła skorupy nie jest modyfikowany w ogólesource
). Nie możesz zrobić nic z osobnego procesu.Odpowiedź Gillesa jest poprawna, ale nie do końca satysfakcjonująca. Kiedy czytam to pytanie, OP chce „wstępnie” przejść do następnego wiersza wprowadzania. W moim przypadku chciałem odczytać aktualną pozycję terminala w mojej funkcji PROMPT_COMMAND. Działa to, ale używa tego samego bufora odczytu, co podstawowa powłoka, więc każde dane wejściowe użytkownika są odrzucane przez fakt, że wykonałem wbudowane wywołanie „odczytu” w funkcji. Więc chciałem odczytać dane wejściowe użytkownika osobno, zrobić odczyt mojego terminala, a następnie umieścić dane wejściowe z powrotem w buforze wejściowym, co jest pierwotnym pytaniem. Pamiętaj, że jest to rzeczywiście ten sam proces, więc teoretycznie powinno to być możliwe.
O ile widzę (w moim bash 4.2), nie ma funkcji, aby programowo wypchnąć coś do stosu wejściowego. W zsh używa się „print -z”.
Więc odpowiedź brzmi: nie jest to możliwe w bash, do tego musisz użyć zsh.
źródło
Alternatywą jest
history -s 'foo'
wypróbowanie:źródło