shell result from cmdline
echo $?
if 0 then success ;else failure
(shell 執行每部返回值,rm -rf 錯誤,打包不能覆蓋)
?
我們知道,linux命令行上一個命令的退出碼放在了$?環境變變中,但是,如果這個命令是一串管道符連接和多個命令,怎么知道每個命令的退出碼?你可以 使用 PIPESTATUS環境變量。比如這個測試:true | false | true; echo "${PIPESTATUS[@]}"
?
解決sudo: sorry, you must have a tty to run sudo 前幾天遇到一個問題,在一個終端中調用另一個shell,始終是無法執行的,后來捕捉到報錯信息為sudo: sorry, you must have a tty to run sudo,后來,在網上了解到可以如下解決: 1. 編輯 /etc/sudoers 1)Defaults ? ?requiretty,修改為 #Defaults ? ?requiretty,表示不需要控制終端。 2)Defaults ? ?requiretty,修改為 Defaults:nobody !requiretty,表示僅 nobody 用戶不需要控制終端。 如果修改為 Defaults:%nobody !requiretty,表示僅 nobody 組不需要控制終端。 其實只要注釋掉)Defaults ? ?requiretty 那個就可以了。表示在執行的時候不打開終端。但是,有的shell必須要有終端才可以執行。這樣顯然是不行的。后來,又找到一片文章才搞定。下面為抄錄的,僅為記錄以后使用。 有些程序/腳本可能在沒有控制終端的環境下上執行(如系統啟動服務時, Daemon, 或者是setsid啟動的程序等) 但可能這個程序需要控制終端, 這這么辦呢? 如我們的例子: 我們在linux啟動時啟動一個服務, 可是中間有個程序(舊的systemtap)使用了sudo 但sudo需要控制終端(當然可以通過修改sudo的配置文件, 但這樣很對用戶不友好啊) 例子: (setsid 啟動的程序會失去控制終端) # setsid sudo ls sudo: sorry, you must have a tty to run sudo (如果你的系統沒有輸出這句話, 那就是你的系統的sudo配置文件允許sudo可以在這個, 請確保已經設置了Defaults ? ?requiretty) 沒有控制中斷的時候, 打開控制終端是這樣的效果: # setsid head -c 0 /dev/tty head: cannot open `/dev/tty' for reading: No such device or address 為了解決這個問題, 所以應該使用能創建(偽)控制終端的程序來啟動你的程序如: script, expect 如: # setsid script -c "sudo ls" /dev/null 或: # setsid expect -c 'spawn sudo ls; expect' #打開控制終端成功: # setsid script -c 'head -c 0 /dev/tty' /dev/null? # setsid expect -c 'spawn head -c 0 /dev/tty; expect' 不過 setsid 跟 script 組合使用有著奇怪的bug, 我這段時間非常的depression, 這樣對script, expect來說, 都是大材小用了
轉載于:https://www.cnblogs.com/SZLLQ2000/p/6210823.html
與50位技術專家面對面20年技術見證,附贈技術全景圖
總結
以上是生活随笔為你收集整理的shell (check return of each line)(PIPESTATUS[@])and sudoer的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。