2015-04-16 28 views
6

Czy ktoś może mi pomóc przekonwertować tę funkcję basha na ryby? Byłoby również miło, gdyby można było wyjaśnić, co to lubią "${@%%.app}”, 's/ /.*/g’, "[email protected]\” itpKonwertuj funkcję basha na rybę

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 \"[email protected]\"" || echo "$location: $bundleid” 
} 

Dzięki bardzo z góry.

+2

Jak próbują rozwiązać ten problem na własną rękę? – mcserep

Odpowiedz

16

Kilka uwag na temat różnic:

  • zmienne ustawienie
    • bash: var=value
    • ryby: set var value
  • argumenty funkcji
  • funkcja zmienne lokalne
    • bash: local var
    • ryb: set -l var
  • warunkowe I
    • bash: [[ ... ]] i [ ... ]
    • ryb: test ...
  • warunkowe II
    • atakujących: if cond; then cmds; fi
    • ryb: if cond; cmds; end
  • warunkowe III
    • atakujących: cmd1 && cmd2
    • ryb: cmd1; and cmd2
  • zastąpienie polecenia
    • atakujących: output=$(pipeline)
    • ryb: set output (pipeline)
  • Zmiana procesu
    • atakujących: join <(sort file1) <(sort file2)
    • ryb: join (sort file1 | psub) (sort file2 | psub)

Dokumentacja

+0

Nadal nie mogę znaleźć odpowiednika "$ {@ %%. App}". Wierzę, że wiem, co robi, to znaczy zwróć cały ciąg w '$ @ ', który zawiera .app na końcu. Więc myślę, że będzie to "$ argv [**. App]" w rybach, ale daje _Nie można rozwinąć_ błędu. – user14492

+0

'$ {@ %%. App}' zwraca listę wszystkich parametrów pozycyjnych z usuniętymi wszystkimi rozszerzeniami ".app". Rybołowy odpowiednik to "dla arg w $ argv; ustawia args $ args (echo "$ arg" | sed 's/.app $ //'); end' –

+0

Myślę, że mógłbyś napisać literówkę w 'sed 's/.app $ //'' z $ w komentarzu powyżej. W przeciwnym razie proszę wyjaśnić, dlaczego tak jest. – user14492