Как остановить Bash расширение '* .h "в функции? - PullRequest
2 голосов
/ 29 апреля 2020

При попытке запустить следующую функцию - Bash неожиданно расширяет мою переменную - тем самым не давая мне получить ожидаемый результат.

Это сводится к тому, как bash имеет дело с "*.h", который я передаю в функцию.

Вот функция, которую я вызываю:

link_files_of_type_from_directory "*.h" ./..

И где я ожидал бы, что эта переменная будет оставаться таким же образом в в какой-то момент, когда он достигает части echo $command_to_run; моего сценария Bash ... эта переменная расширилась до ...

MyHeader1.h MyHeader2.h MyHeader3.h

и т. д.

Что Я хочу, чтобы Bash не расширял мои файлы, чтобы мой код выполнял следующее:

find ./.. -type f -name '*.h'

Вместо

find ./.. -type f -name  MyHeader1.h MyHeader2.h MyHeader3.h 

Это код:

function link_files_of_type_from_directory {
    local file_type=$1;
    local directory_to_link=$2;

    echo "File type $file_type";
    echo "Directory to link $directory_to_link";

    command="find $directory_to_link -type f -name $file_type";
    echo $command;

    #for i in $(find $directory_to_link -type f -name $file_type);
    for i in $command;
        do 
            echo $i;
            if test -e $(basename $i); then
            echo $i exists;
            else
            echo Linking: $i;
            ln -s $i;
            fi
    done;
}

Как я могу предотвратить расширение, чтобы Bash выполнял поиск файлов, заканчивающихся на *.h, в моем каталоге, который я хочу передать?

ОБНОВЛЕНИЕ 1:

Итак, я обновил вызов, чтобы он был

link_files_of_type_from_directory "'*.h'" ..

И теперь функция собирает строку команды для оценки Вот так:

mmd="find $directory_to_link -type f -name $file_type";

Когда я повторяю это - это правильно:)

find .. -type f -name '*.h'

Но я не могу заставить команду find действительно работать. Вот ошибки / ошибки, которые я получаю, пытаясь правильно собрать for l oop:

# for i in $mmd;        # LOOPS THROUGH STRINGS IN COMMAND
# for i in '$(mdd)';  # RUNS MMD LITERALLY
# for i in ${!mmd};   # Errors out with: INVALID VARIABLE NAME — find .. -type f -name '*.h':

Хотелось бы помочь с этой частью - даже если это другой вопрос:)

1 Ответ

1 голос
/ 29 апреля 2020

С цитированием ваших переменных, удаленных точек с запятой и вашего l oop, заключенного в действие -exec для предотвращения проблем с пробелами, символами табуляции и переводами строк в именах файлов, ваша функция выглядит следующим образом:

function link_files_of_type_from_directory {
    local file_type=$1
    local directory_to_link=$2

    echo "File type $file_type"
    echo "Directory to link $directory_to_link"

    find "$directory_to_link" -type f -name "$file_type" -exec sh -c '
      for i do
        echo "$i"
        if test -e "$(basename "$i")"; then
          echo "$i exists"
        else
          echo "Linking: $i"
          ln -s "$i"
        fi
      done
    ' sh {} +
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...