Lệnh gọi của người dùng là gì?


12

Tôi đang chạy Ubuntu 10.10 với openbox chạy trên đầu trang. Hôm nay tôi nhận thấy một lệnh được gọi caller, tuy nhiên không có trang man, nó không đáp ứng với bất kỳ đầu vào nào (hoặc - trợ giúp) và trong đó không tìm thấy nó.

Bất kỳ ý tưởng nó là gì?

Câu trả lời:


16

Chạy

type caller

và bạn sẽ thấy nó là một vỏ được tích hợp sẵn. Đang chạy

help caller

sẽ hiển thị chức năng của nó, được báo cáo cũng như trong trang hướng dẫn của bash. Tóm tắt

Return the context of the current subroutine call.


3
Tuyệt vời. Tôi không chỉ học được lệnh đó làm gì, tôi còn học lệnh "gõ". Cảm ơn :)

2
TIL bash có một helplệnh tích hợp
nibot

Mà tôi có thể upvote hai lần để dạy không chỉ câu trả lời mà cả quá trình.
dmckee --- ex-moderator mèo con

@Muu, @nibot, @dmckee: cũng type typevậy type help, help typehelp helpcó thể rất vui khi chạy :)
enzotib

10

Lệnh callerđược dựng sẵn (không được chỉ định bởi POSIX) đã xuất hiện trong Bash phiên bản 3.0 và nó trả về ngữ cảnh của bất kỳ lệnh gọi chương trình con đang hoạt động nào. Xem: Bash-Buildins để đọc thêm.

Cú pháp:

caller [FRAMENUMBER]

Nếu số khung được cung cấp dưới dạng số nguyên không âm, nó sẽ hiển thị số dòng, tên chương trình con và tệp nguồn tương ứng với vị trí đó trong ngăn xếp cuộc gọi thực hiện hiện tại.

Không có bất kỳ tham số nào, người gọi sẽ hiển thị số dòng và tên tệp nguồn của lệnh gọi chương trình con hiện tại.

Kiểm tra theo dõi ngăn xếp đơn giản sau đây tại Bash Hackers Wiki :

#!/bin/bash

die() {
  local frame=0
  while caller $frame; do
    ((frame++));
  done
  echo "$*"
  exit 1
}

f1() { die "*** an error occured ***"; }
f2() { f1; }
f3() { f2; }

f3

Đầu ra:

12 f1 ./callertest.sh
13 f2 ./callertest.sh
14 f3 ./callertest.sh
16 main ./callertest.sh
*** an error occured ***

Dưới đây là mẫu của một diehàm khá để theo dõi lỗi trong các tập lệnh phức tạp vừa phải:

{ bash /dev/stdin; } <<<$'f(){ g; }\ng(){ h; }\nh(){ while caller $((n++)); do :; done; }\nf'

Để gỡ lỗi tinh vi hơn, các tính năng gỡ lỗi mở rộng của Bash có sẵn và một số tham số đặc biệt cung cấp nhiều chi tiết hơn so với người gọi (ví dụ BASH_ARG{C,V}). Các công cụ như Bashdb có thể hỗ trợ sử dụng một số tính năng gỡ lỗi nâng cao hơn của Bash.


2

Đó là lệnh dựng sẵn shell: man bash(Sau đó tìm kiếm 'người gọi')
Nó có thể được sử dụng để in dấu vết ngăn xếp.


Cảm ơn mặc dù tôi đã chọn câu trả lời của enzotib khi anh ấy cũng dạy tôi 'loại'. Dù vậy cũng cảm ơn rất nhiều :)
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.