让 fish shell 与 gcloud 命令行工具一起工作?

Posted

技术标签:

【中文标题】让 fish shell 与 gcloud 命令行工具一起工作?【英文标题】:Get fish shell to work with gcloud command line tools? 【发布时间】:2014-10-17 13:13:05 【问题描述】:

有没有人有幸让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

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 文件中添加 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'

【讨论】:

谢谢你 100 次...贝斯很棒! 这似乎不再起作用了,或者更确切地说,当我点击选项卡时,我得到了用于自动完成的文件和文件夹。 github.com/Doctusoft/google-cloud-sdk-fish-completion 结合source '...../google-cloud-sdk/path.fish.inc' 为我工作。 我安装了那个 repo 并认为是它,但最后我将 bass source ~/google-cloud-sdk/path.bash.inc 添加到 ~/.config/fish/config.fish 以使其适用于新终端 “低音!”在我的语言中,意思是“够了!”。这已经足够了。 +1 :)【参考方案2】:

到今天为止,我只能做

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

【讨论】:

这对我来说是可行的解决方案。使用 oh-my-fish 安装它:$ omf install git@github.com:aliz-ai/google-cloud-sdk-fish-completion.git 对我来说,上面的命令给出了权限错误。 $ omf install https://github.com/lgathy/google-cloud-sdk-fish-completion.git 。这有效 第 3 步对我来说已经足够了。谢谢!【参考方案3】:

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

对于tab补全,我不知道fsh的tab补全是怎么工作的,所以一无所有。

【讨论】:

“export PATH=$PATH:/path/to/google-cloud-sdk/bin”的 fsh 等价物是什么? 使用fish_user_paths 通用变量是其中一种可能性:set -U fish_user_paths $fish_user_paths /path/to/google-cloud-sdk/bin 以什么方式@GeorgeKatsanos?我刚刚(再次)尝试过,它对我有用。 添加到fish中的路径:set -gx $PATH /path/to/google-cloud-sdk/bin【参考方案4】:

现在 gcloud 开箱即用地包含了对鱼类的支持,但是我遇到了一个非常烦人的问题。 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"

【讨论】:

“开箱即用”是什么意思?我刚刚安装了它,它不起作用。 现在好像已经修复了。 你是如何安装 gcloud 的?酿造?易于?我认为这个文件并不存在于所有包中【参考方案5】:

我可以通过执行这个来设置完成:

# fisher v3
fisher add aliz-ai/google-cloud-sdk-fish-completion

# fisher v4
fisher install aliz-ai/google-cloud-sdk-fish-completion

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

【讨论】:

【参考方案6】:

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

基本上它会在 bash 中运行一个 bash 脚本,但它会区分它如何改变环境并将其应用到 f​​ish 中。

但是,它不适用于完成,并且对于您的 path.bash 来说,它是矫枉过正的。更像:

更改 var=value 以设置 var 值 将 [ ... ] 更改为测试 ... 将 $( ... ) 更改为 ( ... ) if 不需要 then 并以 end 结尾 将|| 更改为; or&amp;&amp; 更改为; and 将导出更改为 set -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

【讨论】:

对于 path.bash,我会以正常方式编辑您的 PATH,直接将目录添加到路径中。我们添加了 path.bash 以方便不熟悉点文件的人使用,但最有可能是 fsh 用户。【参考方案7】:

使用费希尔:

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

你很高兴

【讨论】:

请edit 在您的回答中说明其工作原理以及为什么它是问题中描述的问题的解决方案。见How to Answer。

以上是关于让 fish shell 与 gcloud 命令行工具一起工作?的主要内容,如果未能解决你的问题,请参考以下文章

Fish shell - 如何插入子命令?

text 如何在macOS上添加conda命令到fish shell

Linux 中 Fish Shell

centos安装fish shell

fish 设置环境变量;fish shell 相关使用说明记录;

我的鱼瞎了? (在 Mac OS Big Sur、M1 Mac 上将其设置为默认 shell 后,fish 无法识别任何命令)