2010-06-16 9 views

Trả lời

20
#!/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.

+3

'basename $ 0' (không có 'echo' là cần thiết) –

+3

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

+2

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

2

Biến $ 0 sẽ cung cấp cho bạn tên của shell thực thi kịch bản trong bash.

6

Bạn chỉ cần

echo $LINENO 
echo $(basename $0) 
+0

'tên cơ sở $ 0' (không có' echo' là cần thiết) –

15

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 
+0

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 –

+0

điều này thật đẹp –