#!/bin/bash
my_variable=100
format () {
    echo $0 ##result of find
    echo $1 ##my_variable
}
export -f format 
find . -type f -exec bash -c format {} \;

Есть ли способ передать my_variable для вызова функции в команде поиска?

0
enuliver 29 Апр 2020 в 17:13

1 ответ

Вы можете просто передать my_variable в качестве дополнительного аргумента оболочке, которая запускает format. (Обратите внимание, что $0 не является первым аргументом функции.)

#!/bin/bash
my_variable=100
format () {
    echo $1  # result of find
    echo $2  # my_variable
}
export -f format 
find . -type f -exec bash -c 'format "$1" "$2"' bash {} "$my_variable" \;

Фиктивный аргумент bash используется для установки $0 в команде, так что {} является первым позиционным аргументом, передаваемым в format.

Чтобы уменьшить количество запусков bash, вы можете использовать форму -exec ... +:

find . -type f -exec bash -c 'v=$1; shift; for f; do format "$f" "$v"; done' \
   bash "$my_variable" {} +

Это передает несколько файлов в оболочку одновременно; сценарий сначала отвечает за извлечение my_variable из списка аргументов, а затем перебирает остальные, вызывая format один раз для каждого файла.

4
chepner 29 Апр 2020 в 19:41