xargs tidak menggunakan alias "ls" saya

8

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 lsalih-alih alias.

Misalnya ( flocateadalah 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 lsalias?

elbarna
sumber
1
Apa sebenarnya yang dimaksud dengan "Saya memiliki GNU di jalur saya"? Apakah direktori yang berisi GNU lsdapat dieksekusi dalam $PATHvariabel lingkungan Anda , dan apakah itu mendahului direktori (mungkin /bin) yang berisi perintah non-GNU ls? Harap perbarui pertanyaan Anda untuk menunjukkan kepada kami nilai aktual Anda $PATH. xargsakan menjalankan perintah pertama ls yang ditemukan di direktori di Anda $PATH; tidak tahu tentang alias.
Keith Thompson

Jawaban:

9

Perintah xargshanya mampu menjalankan perintah, bukan alias. GNU parallel, bagaimanapun, dapat menjalankan fungsi:

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).

Jadi saya akan merekomendasikan:

  • Memberikan xargs path lengkap ke versi ls yang ingin Anda gunakan (atau nama yang tidak ambigu, mungkin glstergantung pada bagaimana itu diinstal pada sistem Anda) atau, jika shell Anda memungkinkan,

  • Mendefinisikan lssebagai fungsi ( function ls { gls "$@"; }; export -f lsdalam bash) dan menggunakan paralel GNU bukan xargs ( parallel -j1jika Anda ingin menggunakan CPU tunggal).

Dhag
sumber
fungsi ekspor hanya berfungsi dengan bashshell. Anda dapat menggunakan xargsdengan fungsi yang diekspor juga: ls() { gls "$@"; }; export -f ls; ... | xargs bash -c '"$0" "$@"' ls
Stéphane Chazelas
Oh, trik yang bagus, ini bisa berguna jika seseorang terpaksa menggunakan xargs.
Dhag
Anda dapat menggunakan env_paralleljika 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.html
Ole Tange
3

Substitusi alias dilakukan oleh shell. Jika shell mencoba memanggil perintah foo, dan ada alias foo=bar, itu shell yang menggantikan foodengan di barsini.

Shell hanya melakukan ini untuk perintah. (Kalau tidak, argumen yang kebetulan sama dengan perintah alias akan diganti juga.) Tapi Anda di lssini tidak dijalankan oleh shell, tetapi argumen untuk xargs. Karena itu, shell tidak menggantinya.

Kemudian xargsdijalankan ls, 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.

marinus
sumber
1
Perhatikan bahwa melakukan alias xargs='xargs 'akan memberi tahu shell untuk memperluas alias setelahnya xargs.
Stéphane Chazelas