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


IIRC screenmoże to dla Ciebie zrobić.
strugee

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.


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.


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.


0

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

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

# or
history -s 'foo'
history -a
history -n
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.