Bash

如何在 linux bash 腳本中擷取錯誤?

  • January 11, 2016

我製作了以下腳本:

# !/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_commandfailing_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 中執行的,因此它不會導致父程序退出。

引用自:https://unix.stackexchange.com/questions/97101