获取 Fish shell 以与 gcloud 命令行工具配合使用?

问题描述 投票:0回答:7

有没有人有幸让 Fish shell 与谷歌的 gcloud 命令行工具一起使用?我不是 Fish 脚本方面的专家,但这是 gcloud 需要运行的两个文件(使用 Fish 的 bash 模式可以正常工作)。 Fish 不允许您根据我的理解获取 bash 文件,因此需要将这些文件转换为 Fish 脚本?

路径.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

路径完成

_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
fish gcloud
7个回答
49
投票

对我有用的就是使用低音。一探究竟: https://github.com/edc/bass

只需将 gcloud 添加到您的 bash_profile 中的行,并在您的

.config/fish/config.fish
文件中将 bass 添加到它们前面,如下所示:

# 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'

17
投票

截至今天,我只能做

  1. brew install --cask google-cloud-sdk
  2. 已将
    source /usr/local/Caskroom/google-cloud-sdk/latest/google-cloud-sdk/path.fish.inc
    添加到我的
    ~/.config/fish/config.fish
  3. 克隆https://github.com/aliz-ai/google-cloud-sdk-fish-completion然后运行
    install.sh

5
投票

对于path.bash,它所做的只是将Cloud SDK bin目录添加到您的PATH中。我们在那里放置了一些奇怪的东西,因为我们希望它能够在 Cloud SDK 目录内部工作,即使在后面,例如符号链接。对于您自己的系统,只需执行相当于“export PATH=$PATH:/path/to/google-cloud-sdk/bin”的 fsh 操作即可。

对于tab补全,我不知道fsh的tab补全是如何工作的,所以我什么也没有。


3
投票

我能够通过执行以下命令来设置完成:

# fisher v3
fisher add lgathy/google-cloud-sdk-fish-completion

# fisher v4
fisher install lgathy/google-cloud-sdk-fish-completion

Fisher 可以在这里找到:https://github.com/jorgebucaran/fisher

补全来源:https://github.com/lgathy/google-cloud-sdk-fish-completion


2
投票

gcloud 现在已经包含开箱即用的 Fish 支持,但是我遇到了一个非常烦人的问题。

google-cloud-sdk/path.fish.inc
(和 @nafg 的答案)中包含的代码使目录发生更改,导致每个新的 shell 会话都在
google-cloud-sdk
目录中启动。

我所做的修改相当简单,添加两行额外的行来获取当前工作目录并在之后恢复它。这似乎已经解决了我的问题,所以希望能帮助其他人搜索“fish 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"

1
投票

这里有一个有趣的方法:http://michelpm.com/blog/2013/07/26/switching-from-zsh-to-fish/

基本上它会在 bash 中运行 bash 脚本,但它会比较它如何改变环境并将其应用到 Fish 中。

但是,它不适用于补全,并且对于您的 path.bash 来说,它是多余的。更像是:

  • 更改 var=value 以设置 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

1
投票

使用渔夫:

fisher install lgathy/google-cloud-sdk-fish-completion

你就可以出发了

© www.soinside.com 2019 - 2024. All rights reserved.