日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

shell 中的 set命令 -e -o 选项作用

發布時間:2024/4/18 编程问答 45 豆豆
生活随笔 收集整理的這篇文章主要介紹了 shell 中的 set命令 -e -o 选项作用 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

工作中經常在shell腳本中看到set的這兩個用法,但就像生活中的很多事情,習慣導致忽視,直到出現問題才引起關注。

1. set -e
set命令的-e參數,linux自帶的說明如下:
"Exit immediately?if a simple command exits with a non-zero status."
也就是說,在"set -e"之后出現的代碼,一旦出現了返回值非零,整個腳本就會立即退出。有的人喜歡使用這個參數,是出于保證代碼安全性的考慮。但有的時候,這種美好的初衷,也會導致嚴重的問題。

真實案例:
腳本a.sh開頭使用了"set -e",且能正常運行。在幾個月或更久以后,因需求升級,在腳本中增加了3行hadoop操作:
#!/bin/bash
set -e
...
/home/work/.../hadoop dfs -rmr /app/.../dir
/home/work/.../hadoop dfs -mkdir /app/.../dir
/home/work/.../hadoop dfs -put file_1 /app/.../dir/
...
這幾行hadoop命令邏輯很簡單:在hdfs上清除并新建一個目錄,并將一份本地文件推送至這個目錄,供后續使用。將這幾行單拎出來,在命令行下執行,除了提示待刪除的目錄不存在,并沒有什么問題,文件還是會被推送到指定的地方。

但第一次執行這個腳本的時候,卻失敗退出了,且導致調用該腳本的程序整體退出,造成了嚴重的后果。原因是hdfs上還沒有這個目錄,rmr這一行會返回255,這個值被腳本前方的"set -e"捕捉到,直接導致了腳本退出。

新增的代碼本身并沒有問題,先刪除再新建目錄,反而是保證數據安全的比較規范的操作,刪除命令本身的容錯性,可以保證后續命令正常執行。事實是這個腳本有好幾百行,且邏輯比較復雜,在增加這幾行代碼的時候,開發人員已經不記得這個腳本里還有個"set -e"埋伏著了。

可見設置"set -e",在腳本開發過程中可能很有幫助,而在開發完成后,特別是對于后期可能有升級的腳本,則可能是埋下了安全隱患。

2. set -o pipefail
對于set命令-o參數的pipefail選項,linux是這樣解釋的:
"If set, the return value of a pipeline is the value of the last (rightmost) command to exit with a??non-zero??status,or zero if all commands in the pipeline exit successfully.??This option is disabled by default."

設置了這個選項以后,包含管道命令的語句的返回值,會變成最后一個返回非零的管道命令的返回值。聽起來比較繞,其實也很簡單:

# test.sh
set -o pipefail
ls ./a.txt |echo "hi" >/dev/null
echo $?

運行test.sh,因為當前目錄并不存在a.txt文件,輸出:
ls: ./a.txt: No such file or directory
1??#?設置了set -o pipefail,返回從右往左第一個非零返回值,即ls的返回值1

注釋掉set -o pipefail?這一行,再次運行,輸出:
ls: ./a.txt: No such file or directory
0??# 沒有set -o pipefail,默認返回最后一個管道命令的返回值

總結

以上是生活随笔為你收集整理的shell 中的 set命令 -e -o 选项作用的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。