Tôi muốn tìm ra loại của một số lệnh. Là nó có thể để ống hoặc xargs
kết quả tìm kiếm từ find
vào type
lệnh trong Linux?
Ví dụ:
find . -name anacron | type
hoặc là
find . -name anacron | xargs type
Tôi muốn tìm ra loại của một số lệnh. Là nó có thể để ống hoặc xargs
kết quả tìm kiếm từ find
vào type
lệnh trong Linux?
Ví dụ:
find . -name anacron | type
hoặc là
find . -name anacron | xargs type
Câu trả lời:
type
không phải là một lệnh bình thường. Đó là một buitin vỏ. Xem:
$ type type
type is a shell builtin
Vì vậy, bạn cần phải gọi bash
với -c
để đạt được những gì bạn muốn
$ find . -name anacron | xargs -I '{}' bash -c "type {}"
Hoặc thậm chí đơn giản hơn (không cần xargs
):
$ find . -name anacron -exec bash -c "type {}" \;
Nó sẽ gọi bash -c "type ./file"
, với mọi tập tin được tìm thấy bởi find
. -I
trong xargs
phương tiện, chúng tôi xác định ở đây một trình giữ chỗ {}
để sử dụng sau này. Giữ chỗ này được thay thế bằng tên tệp được tìm thấy.
Tại sao trình dựng vỏ không hoạt động với xargs
:
[...] Các lệnh dựng sẵn được chứa trong chính shell. Khi tên của lệnh dựng sẵn được sử dụng làm từ đầu tiên của lệnh đơn giản, shell sẽ thực thi lệnh trực tiếp mà không cần gọi chương trình khác. [...]
xargs đọc các mục từ đầu vào tiêu chuẩn, [...] và thực thi lệnh
Lệnh trong trường hợp này là một đoạn trích đơn giản và shell dựng sẵn không phải là một tệp thực thi. Nó không thể được tìm thấy trong hệ thống tập tin. Chính trong vỏ. Vì vậy, bạn phải gọi shell và báo cho shell được gọi để gọi lệnh dựng sẵn. Đó là những gì xảy ra với bash -c "command"
.
find ... -exec bash -c 'type "$@"' _ {} +
Có một vài vấn đề ở đây (một số đã được tô sáng):
type
là một nội dung. Đó không phải là một lệnh được giải quyết, đó là một chức năng bên trong bash. Xem man bash-builtins
. Nó chỉ hoạt động trong bối cảnh bash vì vậy không phải là một nhánh con xargs
hoặc -exec
rẽ nhánh.type
được sử dụng để thực hiện tìm kiếm đường dẫn của riêng mình. Nếu bạn cho nó một đường dẫn (như find
sẽ không làm), nó có thể sẽ trả về đường dẫn đó. readlink -f
có thể tốt hơn nếu bạn chỉ cố gắng giải quyết các liên kết tượng trưng; và bạn có thể đi vào xargs readlink
hoặc -exec readlink -f {} +
cả ngày dài.Điều đó không có nghĩa là bạn không thể làm những gì bạn đang cố gắng. Có hai lựa chọn. Các type
lệnh có thể xử lý nhiều tên cùng một lúc vì vậy bạn chỉ có thể cung cấp cho nó tất cả các tên cùng một lúc:
type $(find /usr/sbin -name anacron)
Đối với nhiều lệnh, nếu có quá nhiều đối số, bạn sẽ vượt quá giới hạn độ dài dòng lệnh (xem getconf ARG_MAX
). Tuy nhiên, điều đó sẽ không áp dụng trong trường hợp này vì type
được tích hợp vào trình bao và không tạo ID tiến trình mới (giới hạn độ dài áp dụng cho hàm exec () được sử dụng bởi tiến trình con trong một dòng lệnh thông thường).