Đường ống đến lệnh loại kiểu Viking


10

Tôi muốn tìm ra loại của một số lệnh. Là nó có thể để ống hoặc xargskết quả tìm kiếm từ findvào typelệnh trong Linux?

Ví dụ:

find . -name anacron | type

hoặc là

find . -name anacron | xargs type

Tôi nghĩ rằng câu trả lời của Oli là câu trả lời tốt nhất. Chaos trả lời chỉ hoạt động, nhưng Oli trả lời là thông minh.
Helio

Câu trả lời:


17

typekhô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 bashvớ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. -Itrong xargsphươ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".


3
Bạn có thể ngưng tụ nó đếnfind ... -exec bash -c 'type "$@"' _ {} +
muru

2
@muru thực sự, tôi đọc lại câu trả lời của chính mình và thấy nó =)
hỗn loạn

11

Có một vài vấn đề ở đây (một số đã được tô sáng):

  • typelà 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 xargshoặc -execrẽ 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ư findsẽ không làm), nó có thể sẽ trả về đường dẫn đó. readlink -fcó 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 readlinkhoặ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 typelệ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).


1
Cảm ơn bạn Oli! Newbie linux này đã học được một cái gì đó mới ngày hôm nay liên quan đến "loại" và hành vi của nó.
LjinKazama
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.