Bash
如何在 linux bash 腳本中擷取錯誤?
我製作了以下腳本:
# !/bin/bash # OUTPUT-COLORING red='\e[0;31m' green='\e[0;32m' NC='\e[0m' # No Color # FUNCTIONS # directoryExists - Does the directory exist? function directoryExists { cd $1 if [ $? = 0 ] then echo -e "${green}$1${NC}" else echo -e "${red}$1${NC}" fi } # EXE directoryExists "~/foobar" directoryExists "/www/html/drupal"
該腳本有效,但除了我的迴聲之外,還有輸出
cd $1
執行失敗。
testscripts//test_labo3: line 11: cd: ~/foobar: No such file or directory
有可能抓住這個嗎?
您的腳本在執行時會更改目錄,這意味著它不適用於一系列相對路徑名。然後您稍後評論說您只想檢查目錄是否存在,而不是使用的能力
cd
,因此根本不需要使用答案cd
。修改。使用tput
和顏色來自man terminfo
:#!/bin/bash -u # OUTPUT-COLORING red=$( tput setaf 1 ) green=$( tput setaf 2 ) NC=$( tput setaf 0 ) # or perhaps: tput sgr0 # FUNCTIONS # directoryExists - Does the directory exist? function directoryExists { # was: do the cd in a sub-shell so it doesn't change our own PWD # was: if errmsg=$( cd -- "$1" 2>&1 ) ; then if [ -d "$1" ] ; then # was: echo "${green}$1${NC}" printf "%s\n" "${green}$1${NC}" else # was: echo "${red}$1${NC}" printf "%s\n" "${red}$1${NC}" # was: optional: printf "%s\n" "${red}$1 -- $errmsg${NC}" fi }
(編輯為使用更無懈可擊
printf
的而不是echo
可能作用於文本中的轉義序列的問題。)
用於
set -e
設置出錯時退出模式:如果簡單命令返回非零狀態(表示失敗),則 shell 退出。請注意,
set -e
這並不總是起作用。測試位置的命令允許失敗(例如if failing_command
,failing_command || fallback
)。子shell中的命令只會導致退出子shell,而不是父:set -e; (false); echo foo
顯示foo
。或者,或另外,在 bash(以及 ksh 和 zsh,但不是普通 sh)中,您可以指定在命令返回非零狀態時執行的命令,帶有
ERR
陷阱,例如trap 'err=$?; echo >&2 "Exiting on error $err"; exit $err' ERR
. 請注意,在類似(false); …
的情況下,ERR 陷阱是在子 shell 中執行的,因此它不會導致父程序退出。