Получить рыбную оболочку для работы с инструментами командной строки gcloud?

Неужели кому-нибудь повезло с помощью командной оболочки для работы с инструментами командной строки google gcloud? Я не эксперт в Fish script, но это два файла, которые нужно запустить gcloud (которые отлично работают в режиме Fish bash). Рыба не позволяет вам экспортировать файлы bash из того, что я понимаю, поэтому они должны быть преобразованы в Fish script?

path.bash

script_link="$( readlink "$BASH_SOURCE" )" || script_link="$BASH_SOURCE"
apparent_sdk_dir="${script_link%/*}"
if [ "$apparent_sdk_dir" == "$script_link" ]; then
  apparent_sdk_dir=.
fi
sdk_dir="$( command cd -P "$apparent_sdk_dir" && pwd -P )"
bin_path="$sdk_dir/bin"
export PATH=$bin_path:$PATH

path.completion

_python_argcomplete() {
    local IFS=''
    COMPREPLY=( $(IFS="$IFS"                   COMP_LINE="$COMP_LINE"                   COMP_POINT="$COMP_POINT"                   _ARGCOMPLETE_COMP_WORDBREAKS="$COMP_WORDBREAKS"                   _ARGCOMPLETE=1                   "$1" 8>&1 9>&2 1>/dev/null 2>/dev/null) )
    if [[ $? != 0 ]]; then
        unset COMPREPLY
    fi
}
complete -o default -F _python_argcomplete "gcloud"

_completer() {
    command=$1
    name=$2
    eval '[[ "$'"${name}"'_COMMANDS" ]] || '"${name}"'_COMMANDS="$('"${command}"')"'
    set -- $COMP_LINE
    shift
    while [[ $1 == -* ]]; do
          shift
    done
    [[ $2 ]] && return
    grep -q "${name}\s*$" <<< $COMP_LINE &&
        eval 'COMPREPLY=($'"${name}"'_COMMANDS)' &&
        return
    [[ "$COMP_LINE" == *" " ]] && return
    [[ $1 ]] &&
        eval 'COMPREPLY=($(echo "$'"${name}"'_COMMANDS" | grep ^'"$1"'))'
}

unset bq_COMMANDS
_bq_completer() {
    _completer "CLOUDSDK_COMPONENT_MANAGER_DISABLE_UPDATE_CHECK=1 bq help | grep '^[^ ][^ ]*  ' | sed 's/ .*//'" bq
}

unset gsutil_COMMANDS
_gsutil_completer() {
    _completer "CLOUDSDK_COMPONENT_MANAGER_DISABLE_UPDATE_CHECK=1 gsutil help | sed /Additional/q | grep '^  ' | sed -e 's/^  //' -e 's/ .*//'" gsutil
}

unset gcutil_COMMANDS
_gcutil_completer() {
    _completer "CLOUDSDK_COMPONENT_MANAGER_DISABLE_UPDATE_CHECK=1 gcutil help | grep -v '^information' | grep '^[a-z]' | sed -e 's/ .*//' -e '/^$/d'" gcutil
}

complete -o default -F _bq_completer bq
complete -o default -F _gsutil_completer gsutil
complete -o default -F _gcutil_completer gcutil

Ответ 1

Что сработало для меня, просто использовал бас. Проверьте это: https://github.com/edc/bass

Просто возьмите строки, которые gcloud добавляет в ваш файл bash_profile, и добавьте бас к ним в ваш .config/fish/config.fish файл следующим образом:

# The next line updates PATH for the Google Cloud SDK.
bass source '/Users/hunter/bin/google-cloud-sdk/path.bash.inc'

# The next line enables shell command completion for gcloud.
bass source '/Users/hunter/bin/google-cloud-sdk/completion.bash.inc'

Ответ 2

Для path.bash все, что он делает, это добавить каталог bin Cloud SDK в ваш PATH. Мы помещаем некоторые странные вещи там, потому что мы хотели, чтобы он работал из каталога Cloud SDK даже позади, например, символической ссылки. Для вашей собственной системы просто выполните эквивалент fsh "export PATH = $PATH:/path/to/google-cloud-sdk/bin".

Для завершения вкладки, я не знаю, как работает завершение вкладки fsh, поэтому у меня ничего нет.

Ответ 3

Поддержка рыбы теперь включена из коробки с gcloud, однако я столкнулся с довольно раздражающей проблемой. Код, включенный в google-cloud-sdk/path.fish.inc (и @nafg answer), оставляет каталог измененным, в результате каждый новый сеанс оболочки начинается в каталоге google-cloud-sdk.

Модификация, которую я сделал, была довольно простой, добавив две дополнительные строки, чтобы получить текущий рабочий каталог и восстановить его впоследствии. Это, похоже, разрешило проблему для меня, поэтому, надеюсь, поможет любому другому человеку, ищущему проблемы с "рыбой gcloud".

set restore_dir (pwd -P)
set sdk_dir (builtin cd "$apparent_sdk_dir" > /dev/null; and pwd -P)
set bin_path "$sdk_dir/bin"
cd "$restore_dir"

Ответ 4

Здесь интересный подход: http://michelpm.com/blog/2013/07/26/switching-from-zsh-to-fish/

В основном он будет запускать bash script в bash, но он будет отличаться от того, как он изменяет среду и применяет ее к рыбе.

Однако он не будет работать для доработок и для вашего пути. Больше похоже:

  • Изменить значение var = для установки значения var
  • Измените [...], чтобы проверить...
  • Измените $(...) на (...)
  • if не нужен then и заканчивается на end
  • Измените || на ; or и && на ; and
  • Изменить экспорт для установки -x

Итак, без тестирования здесь я бы попытался:

set script_link ( readlink "$BASH_SOURCE" ); or set script_link $BASH_SOURCE
set apparent_sdk_dir ${script_link%/*}
if test "$apparent_sdk_dir" == "$script_link" ;
  set apparent_sdk_dir .
end
set sdk_dir ( command cd -P "$apparent_sdk_dir"; and pwd -P )
set bin_path $sdk_dir/bin
set -x PATH $bin_path:$PATH

Ответ 5

На сегодняшний день я смог просто сделать

  1. brew cask install google-cloud-sdk
  2. Добавлен source/usr/local/Caskroom/google-cloud-sdk/latest/google-cloud-sdk/path.fish.inc для моего ~/.config/fish/config.fish
  3. Clone https://github.com/aliz-ai/google-cloud-sdk-fish-completion, затем запустите install.sh.