Преобразование функции bash в функцию fish

Может ли кто-нибудь помочь мне преобразовать эту функцию bash в рыбу? Также было бы неплохо, если бы вы могли объяснить, что они делают, например "${@%%.app}”, 's/ /.*/g’, "$@\” и т. д.

bid() {
    local shortname location

    # combine all args as regex
    # (and remove ".app" from the end if it exists due to autocomplete)
    shortname=$(echo "${@%%.app}"|sed 's/ /.*/g')
    # if the file is a full match in apps folder, roll with it
    if [ -d "/Applications/$shortname.app" ]; then
        location="/Applications/$shortname.app"
    else # otherwise, start searching
        location=$(mdfind -onlyin /Applications -onlyin ~/Applications -onlyin /Developer/Applications 'kMDItemKind==Application'|awk -F '/' -v re="$shortname" 'tolower($NF) ~ re {print $0}'|head -n1)
    fi
    # No results? Die.
    [[ -z $location || $location = "" ]] && echo "$1 not found, I quit" && return
    # Otherwise, find the bundleid using spotlight metadata
    bundleid=$(mdls -name kMDItemCFBundleIdentifier -r "$location")
    # return the result or an error message
    [[ -z $bundleid || $bundleid = "" ]] && echo "Error getting bundle ID for \"$@\"" || echo "$location: $bundleid”
}

Большое спасибо заранее.


person user14492    schedule 16.04.2015    source источник
comment
Как вы пытались решить эту проблему самостоятельно?   -  person mcserep    schedule 16.04.2015


Ответы (1)


Некоторые примечания о различиях:

  • setting variables
    • bash: var=value
    • рыба: set var value
  • function arguments
    • bash: "$@"
    • рыба: $argv
  • function local variables
    • bash: local var
    • рыба: set -l var
  • conditionals I
    • bash: [[ ... ]] and [ ... ]
    • рыба: test ...
  • conditionals II
    • bash: if cond; then cmds; fi
    • рыба: if cond; cmds; end
  • conditionals III
    • bash: cmd1 && cmd2
    • рыба: cmd1; and cmd2
    • рыба (начиная с рыбы 3.0): cmd1 && cmd2
  • command substitution
    • bash: output=$(pipeline)
    • рыба: set output (pipeline)
  • process substitution
    • bash: join <(sort file1) <(sort file2)
    • рыба: join (sort file1 | psub) (sort file2 | psub)

Документация

person glenn jackman    schedule 16.04.2015
comment
Я до сих пор не могу определить рыбный эквивалент ${@%%.app}. Кажется, я знаю, что он делает, т.е. возвращает всю строку в $@, содержащую .app в конце. Так что я бы подумал, что это будет $argv[**.app] в рыбе, но это дает ошибку Could Not Expand. - person user14492; 16.04.2015
comment
${@%%.app} возвращает список всех позиционных параметров с удаленными расширениями .app. Эквивалент рыбы for arg in $argv; set args $args (echo "$arg" | sed 's/.app$//'); end - person glenn jackman; 16.04.2015
comment
Я думаю, вы могли сделать опечатку в sed ’s/.app$//‘ с $ в комментарии выше. В противном случае не могли бы вы объяснить, почему он там. - person user14492; 24.04.2015
comment
для каждого элемента массива argv мы удаляем расширение .app, которое появляется в конце имени файла. $ — это привязка к концу строки регулярного выражения. На самом деле у меня должно быть sed 's/\.app$//' без точки. - person glenn jackman; 24.04.2015
comment
Спасибо, без экранирования точки не дало ожидаемых результатов с $. - person user14492; 24.04.2015
comment
Вы должны начать новый вопрос и показать, что вы делаете в рыбе. Это работает: set argv foo.bar.app qux baz.app; for arg in $argv; set args $args (echo "$arg" | sed 's/.app$//'); end; echo $args выводит foo.bar qux baz - person glenn jackman; 24.04.2015
comment
bass упрощает использование утилит, написанных для Bash, в оболочке fish. - person jitter; 01.10.2018