1 回答
TA貢獻(xiàn)1856條經(jīng)驗(yàn) 獲得超17個(gè)贊
問(wèn)題
但是,如果我專(zhuān)門(mén)調(diào)用了錯(cuò)誤的命令,例如 exec.Command ("bash", "-c", "lss"),我會(huì)得到:
panic: exit status 127在本機(jī) ubuntu 終端中,我得到以下結(jié)果:
Command 'lss' not found, did you mean:和命令的枚舉。
這與 Go 無(wú)關(guān),問(wèn)題實(shí)際上有兩個(gè)方面:
Ubuntu 附帶一個(gè)特殊的包,
command-not-found通常是預(yù)先安裝的,它通過(guò)使用兩種技術(shù)來(lái)嘗試使終端對(duì)普通人更友好:它試圖建議更正拼寫(xiě)錯(cuò)誤(您的情況)。
當(dāng)用戶(hù)嘗試執(zhí)行一個(gè)程序時(shí),它會(huì)嘗試建議要安裝的軟件包,如果用戶(hù)安裝了特定的軟件包,該程序?qū)⒖捎谩?/p>
當(dāng)找不到該命令時(shí),“plain”(見(jiàn)下文)shell 通過(guò)返回非零退出代碼使嘗試失敗。
這是完全可以預(yù)料和正常的。我的意思是,對(duì)此感到恐慌是絕對(duì)不明智的。在 Unix 系統(tǒng)上運(yùn)行 shell 的方式存在歷史差異。
當(dāng)用戶(hù)登錄系統(tǒng)時(shí)(請(qǐng)記住,在發(fā)明外殼概念的日子里,您將通過(guò)硬件計(jì)算機(jī)終端登錄,這基本上是您的 GNOME 終端窗口,但在硬件中,并通過(guò)電線(xiàn)連接),即啟動(dòng)所謂的登錄shell。
邏輯外殼的主要思想是為用戶(hù)提供交互環(huán)境。但是您肯定知道,shell 也能夠執(zhí)行腳本。當(dāng) shell 執(zhí)行腳本時(shí),它以非交互模式運(yùn)行。
Unix shell 可以工作的模式
現(xiàn)在讓我們更深入地研究交互式與非交互式 shell。
在交互模式下:
shell 通常連接到真實(shí)終端(hadrware 或終端仿真器;您的 GNOME 終端窗口是終端仿真器)。
“已連接”是指將shell 的標(biāo)準(zhǔn)I/O 流連接到終端,以便終端顯示shell 打印的內(nèi)容。它為用戶(hù)啟用了某些花里胡哨,通常提供有限的方法來(lái)編輯正在輸入的內(nèi)容(
bash例如,使用 GNUreadline.在非交互模式下:
shell 的標(biāo)準(zhǔn) I/O 流連接到一些文件(或“無(wú)處”——比如
/dev/null)。沒(méi)有啟用任何花里胡哨的功能——因?yàn)闆](méi)有人可以使用它們。
GNUbash能夠在這兩種模式下運(yùn)行,它運(yùn)行在哪種模式下取決于它是如何被調(diào)用的。
在不同的模式下初始化時(shí),bash 讀取不同的初始化腳本,這就解釋了為什么command-not-found包提供的機(jī)器會(huì)進(jìn)入交互模式,而在其他情況下運(yùn)行 bash 時(shí)不會(huì)——就像你從 Go 調(diào)用一樣。
遇到問(wèn)題怎么辦
最簡(jiǎn)單的嘗試是使用--login命令行選項(xiàng)運(yùn)行 bash,或者讓它認(rèn)為它作為交互式 shell 運(yùn)行。
這可能會(huì)解決您的問(wèn)題,但不一定。
下一個(gè)可能的問(wèn)題是,有些程序確實(shí)會(huì)檢查它們是否在終端上運(yùn)行——通常這些程序堅(jiān)持與用戶(hù)進(jìn)行真正的交互,通常是出于安全目的,有些程序在未連接到終端時(shí)根本無(wú)法運(yùn)行一個(gè)真正的終端——這些是“全屏”文本 UI 程序,例如 GNU Midnight Commander、Vim、Emacs、GNU Nano 和類(lèi)似的任何東西。
要解決這個(gè)問(wèn)題,唯一的解決方案是在偽終端環(huán)境中運(yùn)行 shell,這就是 @eudore 在他們的評(píng)論中暗示的。可能是一個(gè)開(kāi)始查看的包
;還提供了一些方法來(lái)糾纏 PTY。github.com/creack/ptygolang.org/x/crypto/ssh
- 1 回答
- 0 關(guān)注
- 197 瀏覽
添加回答
舉報(bào)
