Có biến nào trong bash chứa tên tệp .sh được thực thi không?
Số dòng cũng sẽ tuyệt vời.Tương đương với `__FILE__`,` __LINE__` trong bash
Tôi muốn sử dụng nó trong các thông báo lỗi như:
echo "ERROR: [$ FILE: L $ line] $ somefile không tìm thấy"
Có biến nào trong bash chứa tên tệp .sh được thực thi không?
Số dòng cũng sẽ tuyệt vời.Tương đương với `__FILE__`,` __LINE__` trong bash
Tôi muốn sử dụng nó trong các thông báo lỗi như:
echo "ERROR: [$ FILE: L $ line] $ somefile không tìm thấy"
#!/bin/bash
echo $LINENO
echo `basename $0`
$LINENO
cho số dòng hiện tại $0
cho tệp hiện tại. Tôi đã sử dụng basename
để đảm bảo bạn chỉ nhận được tên tệp chứ không phải đường dẫn.
UPDATE:
#!/bin/bash
MY_NAME=`basename $0`
function ouch {
echo "Fail @ [${MY_NAME}:${1}]"
exit 1
}
ouch $LINENO
Bạn phải vượt qua dòng như một tham số nếu bạn sử dụng cách tiếp cận chức năng khác bạn sẽ nhận được dòng của định nghĩa hàm.
Biến $ 0 sẽ cung cấp cho bạn tên của shell thực thi kịch bản trong bash.
Bạn chỉ cần
echo $LINENO
echo $(basename $0)
'tên cơ sở $ 0' (không có' echo' là cần thiết) –
tôi tìm ra "BASH_SOURCE" và "BASH_LINENO" built-in mảng rất hữu ích:
$ 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"
Gọi sản lượng xx
2010-06-16.15:33:13.069 xx[11]: here
2010-06-16.15:33:13.073 xx[14]: and here
Tôi cũng thích sử dụng các biến BASH_ * như bạn đã mô tả chúng. Dưới đây là một bài viết hay về cách gỡ lỗi các tập lệnh bash mà tôi đã tham chiếu trong quá khứ: http://aymanh.com/how-debug-bash-scripts –
điều này thật đẹp –
'basename $ 0' (không có 'echo' là cần thiết) –
Lưu ý rằng nếu bạn' source' tập lệnh, 'basename $ 0' sẽ trả về tập lệnh gốc. – scribu
Và điều này cũng không hoạt động tốt trong các kịch bản đăng nhập nạp shell (~/.bashrc, /etc/profile.d/*). "BASH_SOURCE" và "BASH_LINENO" tốt hơn nhiều, mặc dù chúng là bashism. – pevik