Theo dõi một số tham số nhất định trên một số lệnh


10

Ví dụ, giả sử tôi có một lệnh git branch(luôn luôn có một vài từ).

Điều tôi muốn là theo dõi khi nào lệnh này được thực thi với các đối số. Ví dụ, nếu tôi thực thi lệnh git branch developmà không có lỗi, tôi muốn lưu developvào một tệp.

Tôi đã cố gắng ghi đè lệnh git trên của tôi .bash_profile, đại loại như thế này:

git () {
    if [ $# -eq 3 ]
    then
        git $@
        echo $2 > /path/tacked_parameters.txt
    else
        git $@
    fi
}

Nhưng dường như nó không hoạt động tốt. Có cách nào để làm điều này?


theo ví dụ của bạn (chi nhánh git phát triển) bạn muốn kiểm tra xem "$ #" có phải là "2" chứ không phải "3" không? ... (2 tham số cho hàm git)
Olivier Dulac

Là một sai lầm, nhưng mã chỉ là một ví dụ
jherran

đồng ý. Tôi đã thêm nhận xét bổ sung bên dưới câu trả lời (tốt) của Stephane. nhận xét của tôi có thể không áp dụng (tôi nghĩ về các .txt như một tập tin nhật ký, nhưng nó có thể là cái gì khác mà không thể có ngày ở trong đó?)
Olivier Dulac

Câu trả lời:


18

Bạn đã có một vài vấn đề ở đây:

  • gitchức năng của bạn đang tự gọi đệ quy thay vì gitlệnh ban đầu .
  • bạn đang sử dụng không $@được trích dẫn mà không có ý nghĩa gì
  • bạn đang bỏ các biến khác không được trích dẫn , yêu cầu shell tách + global chúng.
  • bạn đang sử dụng echocho dữ liệu tùy ý .
  • bạn đang mất trạng thái thoát của gitlệnh ban đầu .
  • bạn đang ghi đè tệp nhật ký của mình theo từng yêu cầu.
  • bạn đang đặt các định nghĩa hàm trong ~/.bash_profileđó có nghĩa là tùy chỉnh phiên đăng nhập của bạn, không phải vỏ của bạn và thường không được đọc bởi các bashyêu cầu không đăng nhập .

Bạn muốn một cái gì đó như:

git() {
  if [ "$#" -eq 3 ]
  then
    local ret
    command git "$@"; ret=$?
    printf '%s\n' "$2" >> /path/tacked_parameters.txt
    return "$ret"
  else
    command git "$@"
  fi
}

Đó là:

  • trích dẫn các biến của bạn,
  • sử dụng commandđể chạy các git lệnh ,
  • lưu trạng thái thoát của gitmột biến cục bộ và trả về nó khi thoát,
  • sử dụng >>thay vì >để chuyển hướng đến tệp nhật ký.
  • sử dụng printfthay vì echo.
  • và đặt nó vào ~/.bashrcthay thế của bạn (đảm bảo rằng bạn ~/.bash_profileđang tìm nguồn cung ứng ~/.bashrcdưới dạng các bashvỏ đăng nhập không được đọc ~/.bashrctheo mặc định (một bashlỗi / lỗi sai)). Trừ khi bạn muốn xuất githàm đó (với export -f git) trong trường hợp bạn cũng muốn bashcác tập lệnh gọi gitđể gọi hàm đó.

1
Giải thích tuyệt vời và hoạt động như một nét duyên dáng. Cảm ơn rât nhiều.
jherran

+1 cho một câu trả lời rất tốt. Nhưng op có thể cần phải thay đổi séc [ "$#" -eq 2 ], theo ví dụ của anh ấy. Và nó cũng có thể là một ý tưởng tốt để thêm ngày vào "tacked_parameter.txt". Và tôi sẽ đi theo trường hợp chung (nghĩa là không chỉ theo dõi các tham số thứ 2 khi 2 tham số, mà theo dõi bất kỳ tham số nào): Tôi sẽ thoát khỏi if và và : printf '%s: %s\n' "$(date '+%Y-%m-%dT%H:%M:%S')" "$0 $*"? (ví dụ, hiển thị các lệnh + tất cả các thông số (lưu ý rằng bạn vẫn bị mất một số thông tin, ví dụ trong đó tham số của có nội dải phân cách, nếu có) xách tay ngày. chặt chẽ theo tiêu chuẩn ISO8601)
Olivier Dulac
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.