[英]What is exclamation mark at beginning of line doing in this BASH snippet?
我理解C-shell和BASH中的歷史擴展,但我不明白為什么帶有read
命令的行上的感嘆號正在我正在查看的某個源代碼片段中使用:
#!/bin/bash
set -e
. "$(dirname "$0")/includes.sh"
! read -d '' SOME_VAR <<"EOT"
some ASCII art
EOT
echo -e "\033[95m$SOME_VAR\033[0m"
為什么要否定read
命令的返回值(我認為這是它的影響,而不是歷史擴展)? 除了內存外,是否有任何可能的錯誤情況? 我能想到的唯一一個是EINTR
,我認為這是一個中止條件( SIGINT
或SIGHUP
)。 為什么你會引用起始heredoc
標記(在這種情況下是EOT
),而不是結束標記?
它來自一個主要的開源項目,所以我猜測作者有一些理由這樣做,我無法辨別。
如果管道返回非零退出狀態(基本上如果命令失敗), set -e
命令告訴bash退出。
的!
否定退出狀態,但它也抑制了set -e
的影響。 這個想法是,如果一個命令作為一個條件的一部分被執行,你不想終止shell。 如果它之前是!
,shell有效地假定它作為條件執行(即使結果被忽略)。
引用bash手冊:
如果失敗的命令是緊跟在'while'或'until'關鍵字之后的命令列表的一部分,在'if'語句中的測試的一部分,在'&&'中執行的任何命令的一部分,則shell不會退出'||' 列表除了最后的'&&'或'||'之外的命令,管道中的任何命令但是最后一個命令,或者命令的返回狀態是否被'!'反轉。
https://www.gnu.org/software/bash/manual/html_node/The-Set-Builtin.html
(你是正確的!
在這種情況下, !
與歷史替換無關。)
read
內置的返回碼是
零,除非遇到文件結束,
read
超時(在這種情況下它大於128),發生變量賦值錯誤,或者提供無效的文件描述符作為-u的參數。
這里的相關案例是文件結尾。 使用<<EOT
(並使用-d ''
禁用正常終止)重定向read
輸入意味着read
命令將遇到文件結束,這將導致它返回非零狀態。 的!
防止此操作中止該腳本(但該值仍分配給$SOME_VAR
)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.