xargs không sử dụng bí danh của tôi


8

Trên AIX (nhưng điều này cũng xảy ra trên HP-UX), tôi có GNU ls trong đường dẫn của mình và nó cũng có biệt danh là ls.

Khi tôi sử dụng xargs, nó thay vào đó sử dụng Unix tiêu chuẩn lsthay vì bí danh.

Ví dụ: ( flocatelà một hàm tìm đường dẫn chính xác của chủ đề tìm kiếm):

flocate mirrorvg | xargs ls -lh
ls: illegal option -- h
usage: ls [-1ACFHLNRSabcdefgiklmnopqrstuxEUX] [File...]

ls -lh /usr/sbin/mirrorvg
-r-xr-x--- 1 root system 37K apr  3  2014 /usr/sbin/mirrorvg*

Tại sao xargs không sử dụng lsbí danh?


1
Chính xác thì "Tôi có GNU ls trong đường dẫn của tôi" nghĩa là gì? Là thư mục chứa GNU có thể lsthực thi được trong $PATHbiến môi trường của bạn và nó có đứng trước thư mục (có thể /bin) có chứa lệnh không phải GNU lskhông? Vui lòng cập nhật câu hỏi của bạn để cho chúng tôi thấy giá trị thực tế của bạn $PATH. xargssẽ thực thi lệnh đầu tiên ls mà nó tìm thấy trong một thư mục trong của bạn $PATH; nó không biết về bí danh.
Keith Thompson

Câu trả lời:


9

Lệnh xargschỉ có thể chạy các lệnh, không phải bí danh. GNU song song, tuy nhiên, có thể chạy các chức năng:

The command must be an executable, a script, a composed
command, or a function. If it is a function you need to export
-f the function first. An alias will, however, not work (see
why http://www.perlmonks.org/index.pl?node_id=484296).

Vì vậy, tôi muốn giới thiệu một trong hai:

  • Đưa xargs đường dẫn đầy đủ đến phiên bản ls bạn muốn sử dụng (hoặc một tên không rõ ràng, có lẽ glstùy thuộc vào cách nó được cài đặt trên hệ thống của bạn) hoặc, nếu shell của bạn cho phép,

  • Xác định lslà một hàm ( function ls { gls "$@"; }; export -f lstrong bash) và sử dụng GNU song song thay vì xargs ( parallel -j1nếu bạn muốn sử dụng một CPU).


chức năng xuất khẩu chỉ hoạt động với bashvỏ. Bạn cũng có thể sử dụng xargsvới các chức năng được xuất: ls() { gls "$@"; }; export -f ls; ... | xargs bash -c '"$0" "$@"' ls
Stéphane Chazelas

Ồ, mẹo hay, nó có thể hữu ích nếu người ta buộc phải sử dụng xargs.
dhag

Bạn có thể sử dụng env_parallelnếu bạn muốn sử dụng bí danh hoặc không muốn xuất hàm. Các bí danh được hỗ trợ trong: ash, bash, csh, dash, fish, ksh, mksh, pdksh, tcsh, zsh. Các chức năng được hỗ trợ trong: bash, fish, ksh, mksh, pdksh, sh, zsh. Chúng thậm chí hoạt động nếu bạn chạy các lệnh trên máy chủ từ xa. gnu.org/software/abul/env_abul.html
Ole Tange

3

Việc thay thế bí danh được thực hiện bởi vỏ. Nếu cố gắng vỏ để gọi lệnh foo, và có một bí danh foo=bar, đó là vỏ rằng sản phẩm thay thế các foobằng barở đây.

Shell chỉ làm điều này cho các lệnh. (Mặt khác, các đối số xảy ra giống như một lệnh bí danh cũng sẽ được thay thế.) Nhưng lsở đây của bạn không được chạy bởi trình bao, mà là một đối số xargs. Do đó, vỏ không thay thế nó.

Sau đó xargsthực thi ls, nhưng nó không biết về bí danh, vì vậy nó chỉ chạy cái đầu tiên mà nó tìm thấy trong đường dẫn.

Các bí danh là nội bộ cho trình bao và không có cách nào được chuẩn hóa cho một chương trình để đọc chúng.


1
Lưu ý rằng làm alias xargs='xargs 'sẽ cho vỏ để mở rộng bí danh sau xargs.
Stéphane Chazelas
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.