Untuk memberikan tambahan dan klarifikasi pada beberapa jawaban lain, jika Anda menggunakan opsi massal untuk exec
atau execdir
( -exec command {} +
), dan ingin mengambil semua argumen posisi, Anda perlu mempertimbangkan penanganan $0
dengan bash -c
. Lebih konkret, pertimbangkan perintah di bawah ini, yang digunakan bash -c
seperti yang disarankan di atas, dan cukup gema jalur file yang diakhiri dengan '.wav' dari setiap direktori yang ditemukannya:
find "$1" -name '*.wav' -execdir bash -c 'echo $@' _ {} +
Manual bash mengatakan:
If the -c option is present, then commands are read from the first non-option argument command_string. If there are arguments after the command_string, they are assigned to the
positional parameters, starting with $0.
Di sini, 'check $@'
adalah string perintah, dan _ {}
argumen setelah string perintah. Perhatikan bahwa $@
adalah parameter posisi khusus dalam bash yang diperluas ke semua parameter posisi mulai dari 1 . Perhatikan juga bahwa dengan -c
opsi, argumen pertama ditugaskan ke parameter posisi $0
. Ini berarti bahwa jika Anda mencoba mengakses semua parameter posisi dengan $@
, Anda hanya akan mendapatkan parameter mulai dari $1
dan ke atas. Itulah alasan mengapa jawaban Dominik memiliki _
, yang merupakan argumen dummy untuk mengisi parameter $0
, jadi semua argumen yang kita inginkan tersedia nanti jika kita menggunakan $@
ekspansi parameter misalnya, atau untuk loop seperti dalam jawaban itu.
Tentu saja, mirip dengan jawaban yang diterima, bash -c 'shell_function $0 $@'
juga akan bekerja dengan melewati secara eksplisit $0
, tetapi sekali lagi, Anda harus ingat bahwa $@
itu tidak akan berfungsi seperti yang diharapkan.
$0
.