Wenn Sie die Bulk-Option für execoder execdir( -exec command {} +) verwenden und alle Positionsargumente abrufen möchten, um Ergänzungen und Erläuterungen zu einigen anderen Antworten bereitzustellen , müssen Sie die Behandlung $0mit berücksichtigen bash -c. Betrachten Sie genauer den folgenden Befehl, der bash -cwie oben vorgeschlagen verwendet wird, und geben Sie einfach Dateipfade aus, die mit '.wav' enden, aus jedem gefundenen Verzeichnis:
find "$1" -name '*.wav' -execdir bash -c 'echo $@' _ {} +
Das Bash-Handbuch sagt:
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.
Hier 'check $@'ist die Befehlszeichenfolge und _ {}sind die Argumente nach der Befehlszeichenfolge. Beachten Sie, dass dies $@ein spezieller Positionsparameter in bash ist, der ab 1 auf alle Positionsparameter erweitert wird . Beachten Sie auch, dass bei dieser -cOption das erste Argument dem Positionsparameter zugewiesen wird $0. Das heißt, wenn Sie versuchen, auf alle Positionsparameter mit zuzugreifen $@, erhalten Sie nur Parameter ab $1und nach. Dies ist der Grund, warum Dominiks Antwort das _Dummy-Argument zum Füllen von Parametern enthält $0, sodass alle gewünschten Argumente später verfügbar sind, wenn wir beispielsweise die $@Parametererweiterung oder die for-Schleife wie in dieser Antwort verwenden.
Ähnlich wie bei der akzeptierten Antwort bash -c 'shell_function $0 $@'würde dies natürlich auch durch explizites Übergeben funktionieren $0, aber auch hier müssten Sie bedenken, dass dies $@nicht wie erwartet funktioniert.
$0.