從腳本打開新的 konsole,執行命令並在結束時進行交互

從腳本打開新的 konsole,執行命令並在結束時進行交互

我希望能夠獲得一個腳本(在啟動時運行)來打開konsole終端。
當它打開時,它會執行一些持久性的操作(例如更改目錄和來源 bashrc)並運行長時間運行的程式。
如果程式崩潰或我進來了<ctrl+c>,它就會開始接受來自標準輸入的命令(例如「向上輸入」再試一次,就好像它一直是互動的)。

我已經嘗試了很多方法來讓它工作(我目前只是試圖讓它工作ls並在完成後恢復為互動式);

konsole -e ls
konsole --hold ls
konsole -e /bin/bash -c ls
konsole --hold -e "/bin/bash -c ls"
konsole -e "/bin/bash -i -c ls"
konsole -e /bin/bash -i -c ls
konsole -e "echo ls > /tmp/konsolebash;/bin/bash -i --rcfile /tmp/konsolebash"

echo ls > /tmp/konsolebash
konsole -e "/bin/bash -i --rcfile /tmp/konsolebash"

跟引號有關係嗎?我不應該使用它們嗎?
我甚至打算嘗試執行嗎bash
我已經沒有想法了,但我希望它是可以實現的(但希望不是我錯過的簡單得令人尷尬的事情)。

如果特別是問題所在,我會投票贊成成功使用其他終端模擬器的答案konsole(但由於問題是專門關於konsole我不認為我可以給你多汁的勾號)

答案1

感謝@n.st 的評論,我做了這樣的一個內襯:

konsole -e /bin/bash --rcfile <(echo "cd /;ls;echo hi | less")

這只是一個沒有 tmpfiles 的較短版本,使用 bash 進程取代以下內容;

echo "cd /;ls;echo hi | less" > /tmp/konsolebash;konsole -e /bin/bash --rcfile /tmp/konsolebash

它將運行一些命令,讓它們顯示,更改環境,運行長時間運行的程式(less),當它結束時(:q)將是互動的。
因此,請用您的腳本替換cd /;ls;echo hi | less(演示)。

沒有歷史記錄,但至少您現在位於正確的目錄中,並且擁有您可能想要設定的任何環境變數。


與我之前的嘗試基本上相同;

konsole -e "echo ls > /tmp/konsolebash;/bin/bash -i --rcfile /tmp/konsolebash"

除了文件寫入在konsole執行之外,我已經刪除了該-i標誌並且執行參數不在一個引號區塊中


不幸的是,該--rcfile開關會導致您~/.bashrc無法載入這些命令,因此如果您需要別名或其他內容,則必須這樣做;

cat ~/.bashrc > /tmp/konsolebash; echo "commands" >> /tmp/konsolebash;konsole -e /bin/bash --rcfile /tmp/konsolebash

這只是複製你的 bashrc 然後追加你的命令到最後

答案2

更短更簡單的解決方案:

konsole -e '$SHELL -c "ls; $SHELL"' &

這個也不存在歷史或來源的問題.bashrc。如果你的$SHELL環境變數沒有指向bash,你可以手動指定它。

這確實會在同一終端機視窗內產生第二個(bash)shell,因此第一個命令中的某些內容可能不會被保留。

答案改編自askubuntu回答

相關內容