Umieść tekst w buforze linii poleceń bash

9

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 -ipoleceń.

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

gioele
źródło
IIRC screenmoże to dla Ciebie zrobić.
strugee
1
Ta odpowiedź na SU .
Kamil Maciorowski

Odpowiedzi:

6

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:

writecmd () { 
  perl -e 'ioctl STDOUT, 0x5412, $_ for split //, do{ chomp($_ = <>); $_ }' ; 
}

# Example usage
echo 'my test cmd' | writecmd

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.

trhodes
źródło
Ta odpowiedź jest najbliższa temu, o co poprosił PO.
reza.safiyat
Nieco inna składnia w tej odpowiedzi , &TIOCSTIto ładniejszy niż nieco 0x5412zbyt. 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 Zsh print -znie zadziałały.
dimo414
4

Jeśli jest to funkcja, której zamierzasz użyć w powiązaniu readline, bind -xmożesz ją zmodyfikować READLINE_LINE. ( Przykład )

Poza powiązaniem readline, możesz wcisnąć do historii fałszywe polecenie za pomocą history -s.

Gilles „SO- przestań być zły”
źródło
Problemem jest to, że jeśli to zrobię history -s 'foo'w skrypcie, historia rozpoczęła skorupy nie jest modyfikowany w ogóle
Gioele
@gioele Musisz uruchomić go z poziomu powłoki (np. ze skryptu, który ładujesz source). Nie możesz zrobić nic z osobnego procesu.
Gilles 'SO - przestań być zły'
2

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.

Stijn Hoop
źródło
0

Alternatywą jest history -s 'foo'wypróbowanie:

echo 'foo' >> ~/.bash_history
history -n

# or
history -s 'foo'
history -a
history -n
kcd
źródło