Сохранять массив в файл и загружать массив из файла в BASH [closed]

Как видно из другого ответа, вы должны иметь возможность запускать команду непосредственно из командной строки Cygwin bash. Но если вы передаете аргументы file/dir, собственные программы Windows будут ожидать собственный путь Windows. Вместо того, чтобы пытаться построить такой путь вручную, вы можете использовать инструмент cygpath:

# Emits, for example,  'C:\Program Files\MyApp\MyApp.exe'
cygpath --windows '/cygdrive/c/Program Files/MyApp/MyApp.exe'

Еще одна потенциальная ловушка, о которой следует знать, это то, что у вас могут быть разные значения между Windows и Cygwin для некоторых общих переменных среды, таких как ДОМ или ТЕМП. Это не такая распространенная проблема, но если вы подозреваете, что это может быть так, передайте определение (я) Windows перед командой. Это запустит программу со средой, содержащей переопределенное значение.Например, TEMP /tmp в Cygwin, но совсем другое в Windows, поэтому, если это вызывало проблемы, вы могли столкнуться с что-то вроде:

TEMP="$LOCALAPPDATA\\Temp" MyApp.exe foo bar ...

Наконец, обязательно заключайте в кавычки все аргументы, в которых есть пробелы.

В качестве примечания: у меня есть несколько скриптов-оболочек, связанных с определенными программами Windows, которые позволяют мне вводить аргументы в стиле Cygwin. Обертки, а затем используйте что-то вроде этой функции для преобразования аргументов в готовый формат Windows перед их передачей в собственное приложение:

# Process positional params, converting file path to Windows format
# and adding quotes around other params if they contain spaces. Result
# saved in array named WINFILEARGS. Call Windows app with single
# arg "${WINFILEARGS[@]}"
make_win_file_args() {
    declare -ga WINFILEARGS

    local SPACEREGEX="[[:alnum:]]+[[:space:]]+[[:alnum:]]+"
    local index=0
    for posparam ; do
        currparam="$posparam"
        if [[ -e $currparam ]]; then
            # Convert unix paths from command line to windows paths
            currparam="\"$(cygpath -w "${posparam}")\""
        elif [[ $currparam =~ $SPACEREGEX ]]; then
            # Quote non-file parameters that contain spaces
            currparam="\"${currparam}\""
        fi
        WINFILEARGS[$index]="$currparam"
        (( index=$index+1 ))
    done
}
1
07.08.2015, 09:47
0 ответов

Теги

Похожие вопросы