Pada AIX (tapi ini juga terjadi pada HP-UX), saya memiliki GNU ls di jalur saya dan juga alias ls
.
Ketika saya menggunakan xargs, alih-alih menggunakan standar Unix ls
alih-alih alias.
Misalnya ( flocate
adalah fungsi yang menemukan jalur pasti dari subjek pencarian):
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*
Mengapa xarg tidak menggunakan ls
alias?
ls
dapat dieksekusi dalam$PATH
variabel lingkungan Anda , dan apakah itu mendahului direktori (mungkin/bin
) yang berisi perintah non-GNUls
? Harap perbarui pertanyaan Anda untuk menunjukkan kepada kami nilai aktual Anda$PATH
.xargs
akan menjalankan perintah pertamals
yang ditemukan di direktori di Anda$PATH
; tidak tahu tentang alias.Jawaban:
Perintah
xargs
hanya mampu menjalankan perintah, bukan alias. GNU parallel, bagaimanapun, dapat menjalankan fungsi:Jadi saya akan merekomendasikan:
Memberikan xargs path lengkap ke versi ls yang ingin Anda gunakan (atau nama yang tidak ambigu, mungkin
gls
tergantung pada bagaimana itu diinstal pada sistem Anda) atau, jika shell Anda memungkinkan,Mendefinisikan
ls
sebagai fungsi (function ls { gls "$@"; }; export -f ls
dalam bash) dan menggunakan paralel GNU bukan xargs (parallel -j1
jika Anda ingin menggunakan CPU tunggal).sumber
bash
shell. Anda dapat menggunakanxargs
dengan fungsi yang diekspor juga:ls() { gls "$@"; }; export -f ls; ... | xargs bash -c '"$0" "$@"' ls
env_parallel
jika Anda ingin menggunakan alias atau tidak ingin mengekspor fungsi. Alias didukung dalam: ash, bash, csh, dash, fish, ksh, mksh, pdksh, tcsh, zsh. Fungsi didukung dalam: bash, fish, ksh, mksh, pdksh, sh, zsh. Mereka bahkan bekerja jika Anda menjalankan perintah di server jauh. gnu.org/software/parallel/env_parallel.htmlSubstitusi alias dilakukan oleh shell. Jika shell mencoba memanggil perintah
foo
, dan ada aliasfoo=bar
, itu shell yang menggantikanfoo
dengan dibar
sini.Shell hanya melakukan ini untuk perintah. (Kalau tidak, argumen yang kebetulan sama dengan perintah alias akan diganti juga.) Tapi Anda di
ls
sini tidak dijalankan oleh shell, tetapi argumen untukxargs
. Karena itu, shell tidak menggantinya.Kemudian
xargs
dijalankanls
, tetapi tidak tahu tentang alias, jadi itu hanya menjalankan yang pertama kali ditemukan di jalan.Alias adalah internal ke shell dan tidak ada cara standar untuk program untuk membacanya.
sumber
alias xargs='xargs '
akan memberi tahu shell untuk memperluas alias setelahnyaxargs
.