簡體   English   中英

sh / bash命令替換凍結腳本

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM