Zamiast redagować moje pytanie, pozwól, że opiszę Ci pożądany przypadek użytkownika:
Tworzę krótki skrypt powłoki, aby uruchomić polecenie „gnome-terminal - someoptionflagname„ mój tekst do wysłania ”” i wykonać ten skrypt.
Gnome-terminal wyskakuje, z wierszem poleceń i moim tekstem.
to znaczy: fields@mycomputer:/$ my text to be posted
Czy można to zrobić?
xnee
teraz.Odpowiedzi:
Możesz to zrobić za pomocą funkcji expect ( install ). Utwórz i wykonaj plik wykonywalny
~/bin/myprompt
:i uruchom Gnome Terminal z:
źródło
Jeśli dobrze rozumiem, chcesz, aby pierwszy wiersz wejściowy był wypełniony zawartością przekazywaną w wierszu poleceń gnome-terminal.
Nie wiem, jak to zrobić dokładnie za pomocą bash, ale oto coś, co się zbliża. W swoim
~/.bashrc
dodaj następujący wiersz na samym końcu:Biegać
gnome-terminal -x env BASH_INITIAL_COMMAND='my text to be posted' bash
i naciśnijUp w monicie, aby przywołać tekst.Zauważ też, że jeśli umieścisz
set -o history
na końcu swoje komentarze.bashrc
, zostaną one wprowadzone do historii wraz z rozpoczęciem bash, więc możesz użyć ich jako podstawy do edycji, docierając do nich Upklawiszem i usuwając inicjał#
.źródło
Sugestia ændrük jest bardzo dobra i działała dla mnie, jednak polecenie jest zakodowane na stałe w skrypcie, a jeśli zmienisz rozmiar okna terminala, to nie działa dobrze. Używając jego kodu jako podstawy, dodałem możliwość wysłania skryptu myprompt polecenia jako argumentu, a ten skrypt poprawnie obsługuje zmianę rozmiaru okna terminala.
i uruchom Gnome Terminal z:
źródło
Odpowiedź ændrüka jest dobra, ale może trochę ciężka do zadania.
Oto skrypt, który pisze skrypt na podstawie swoich argumentów
Jeśli nie wykonałeś dużo programowania powłoki, wydaje się, że jest tu więcej magii niż jest. Najpierw nazywam plik tymczasowy do przechowywania skryptu, gdzie
$$
jest identyfikator procesu powłoki uruchamiającej ten skrypt. The/tmp/something.$$
Metafora jest stosowana w przypadku dwóch wystąpień tego skryptu są uruchamiane w tym samym czasie, nie będzie próbował użyć tego samego pliku tymczasowego.Zmienna
$SHELL
jest ustawiona na nazwę powłoki uruchamiającej skrypt. Jeśli używasz / usr / bin / bash, prawdopodobnie chcesz, aby mini-skrypt również z niego korzystał.Jest
"$@"
to idiom powłoki „interpoluj wszystkie moje argumenty, w razie potrzeby przytaczając je”. Ta szczególna składnia powodujeinterpolować argumenty jako dwa elementy
zamiast czterech, które
$@
by się poddałyOstatnie wiersze skryptu określają, że terminal gnome uruchamia mini-skrypt, a następnie uruchamia interaktywną powłokę. Kiedy gnome-terminal kończy pracę, skrypt tymczasowy jest usuwany, ponieważ śmiecenie jest niestosowne.
Ostatni wiersz nie jest częścią mini-skryptu, pokazuje, że mini-skrypt działa. Jeśli powyższy 11-wierszowy skrypt znajduje się w pliku o nazwie,
rt.sh
tochmod
powoduje, że jest wykonywalny, a następnie jest wykonywany.Wynikiem tego wszystkiego będzie terminal gnome, który się uruchomi
w pierwszym wierszu, a następnie uruchamia interaktywną powłokę:
źródło
gnome-terminal -x sh -c "echo hello world; bash"
, czego nie sądzę.Dwie odpowiedzi, które najbardziej podobały mi się w rozwiązaniu, są następujące
expect
i ta, w której zalecają użycie--init-file
flagi w shebang lub podczas uruchamiania terminala:... i wykonaj go jako:
expect
jest prawdopodobnie lepszym rozwiązaniem (z powodów, które przedstawię), z wyjątkiem tego, że nie mogę kontrolować, czy jest zainstalowany w moim środowisku docelowym.Problem z bash wpadł na
--init-file
agnome-terminal
„s--command
jako hack do rozwiązania Jest to powłoka nie ma dostępu do standardowego wejścia podczas wykonywania skrypty inicjujące. Jeśli na przykład chcę uruchomić coś, co wymagałoby wprowadzenia danych przez użytkownika (ftp, telnet itp.), Ale pozostawienie uruchomionej powłoki nadrzędnej nie zadziała; jedynym wyjątkiem, jaki do tej pory widziałem, jest ssh:... ale to, czego potrzebuję, jest bardziej skomplikowane niż ten przykład zabawki. W każdym razie mam nadzieję, że
--init-file
te informacje będą przydatne dla każdego, kto czyta to pytanie.źródło
Możesz użyć argumentów
-e
lub,-x
aby uruchomić polecenie w nowo wyskakującym terminalu, ale nie jest to dokładnie to, czego chcesz.źródło