bash中是否包含执行的.sh文件的名称?行号也很棒。
我想在错误消息中使用它,例如:
echo "ERROR: [$FILE:L$LINE] $somefile not found"
答案 0 :(得分:26)
#!/bin/bash
echo $LINENO
echo `basename $0`
$LINENO
表示当前行号
$0
表示当前文件。我使用basename
来确保您只获取文件名而不是路径。
更新:
#!/bin/bash
MY_NAME=`basename $0`
function ouch {
echo "Fail @ [${MY_NAME}:${1}]"
exit 1
}
ouch $LINENO
如果使用函数方法,则必须将该行作为参数传递,否则您将获得函数定义的行。
答案 1 :(得分:20)
我发现“BASH_SOURCE”和“BASH_LINENO”内置数组非常有用:
$ cat xx
#!/bin/bash
_ERR_HDR_FMT="%.23s %s[%s]: "
_ERR_MSG_FMT="${_ERR_HDR_FMT}%s\n"
error_msg() {
printf "$_ERR_MSG_FMT" $(date +%F.%T.%N) ${BASH_SOURCE[1]##*/} ${BASH_LINENO[0]} "${@}"
}
error_msg "here"
error_msg "and here"
调用xx产生
2010-06-16.15:33:13.069 xx[11]: here
2010-06-16.15:33:13.073 xx[14]: and here
答案 2 :(得分:6)
你只需要
echo $LINENO
echo $(basename $0)
答案 3 :(得分:2)
这是在可重用函数中执行此操作的方法。如果以下文件位于名为script
的文件中:
#!/bin/bash
debug() {
echo "${BASH_SOURCE[1]##*/}:${FUNCNAME[1]}[${BASH_LINENO[0]}]" > /dev/tty
}
debug
这将产生输出:
script:main[5]
其中指示了debug
被调用的行。
以下内容将打印出文件名,函数,行和可选消息。
还可以在zsh
中工作,以获得更多好处。
# Say the file, line number and optional message for debugging
# Inspired by bash's `caller` builtin
# Thanks to https://unix.stackexchange.com/a/453153/143394
function yelp () {
# shellcheck disable=SC2154 # undeclared zsh variables in bash
if [[ $BASH_VERSION ]]; then
local file=${BASH_SOURCE[1]##*/} func=${FUNCNAME[1]} line=${BASH_LINENO[0]}
else # zsh
emulate -L zsh # because we may be sourced by zsh `emulate bash -c`
# $funcfiletrace has format: file:line
local file=${funcfiletrace[1]%:*} line=${funcfiletrace[1]##*:}
local func=${funcstack[2]}
[[ $func =~ / ]] && func=source # $func may be filename. Use bash behaviour
fi
echo "${file##*/}:$func:$line $*" > /dev/tty
}