[英]sh/bash command substitution freezes script
有一個簡單的單行腳本:
myvar=`nano`
如果我使用bash或sh運行它,它將凍結當前的終端會話,並且不會顯示編輯器。 我嘗試了其他交互式程序和不同的操作系統(Ubuntu,FreeBSD),結果始終相同。 我認為是因為這些程序忽略了信號,但我不明白為什么它們不能以這種方式啟動。
我需要此方法,因為我想釋放捕獲用戶輸入的文本並將其返回給調用方的函數。 例如:
function read_text()
{
local tempfile=`mktemp`
nano $tempfile
cat $tempfile
rm $tempfile
}
echo "Press ENTER to input your comment."
read # ENTER
comment=`read_text`
更新 :
感謝Tripleee指導我解決此問題。 我找到了簡單的解決方案。 這是將問題重定向到當前端子線。
有一個簡單的單行腳本:
myvar=`nano > $(tty)`
完整示例:
read_text()
{
local tempfile=`mktemp`
nano $tempfile > `tty`
cat $tempfile
rm $tempfile
}
comment=`read_text`
echo $comment
您不能在后架內部運行交互式命令,因為后架將阻止程序與終端之間的交互式輸入和輸出。
合理地重構您的問題將是在調用方中處理臨時文件,並取消使用該函數; 或至少縮小功能范圍。
local tempfile=$(mktemp)
${VISUAL-nano} "$tempfile"
comment=$(cat "$tempfile")
rm "$tempfile"
還請注意,此代碼如何使用$VISUAL
並僅在未設置此標准變量的情況下才退回到nano
。
對於大多數現實情況,如果輸入任務足夠重要,可以保證使用外部編輯器,則最好傳遞臨時文件(在腳本的最后使用trap
將其刪除)。將其內容抓取到shell變量中。
# At the beginning of your script
tmpdir=$(mktemp -d -t yourscript.XXXXXXXX)
trap 'rm -rf "$tmpdir"' 0
trap 'exit 127' 1 2 3 5 15
:
echo '# Enter your comment here' >"$tmpdir"/comment
${VISUAL-nano} "$tmpdir"/comment
如您所見,結果非常簡單,您實際上不需要將其封裝到單獨的函數中。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.