簡體   English   中英

在這個BASH片段中,行開頭的感嘆號是什么?

[英]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 ,我認為這是一個中止條件( SIGINTSIGHUP )。 為什么你會引用起始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.

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