【问题标题】:What's the equivalent to ${var:-defaultvalue} in fish?鱼中的 ${var:-defaultvalue} 等价于什么?
【发布时间】:2019-02-06 01:51:14
【问题描述】:

您好,我正在尝试将我的 .bashrc 转换为 fish 格式,几乎完成了,文档中大部分内容都很清楚,但这部分让我很头疼。所以我的 gnupg 可以与我的 yubikey ssh 等一起使用。 鱼的版本是Arch GNU/Linux下的最新3.0

BASH 上的原创:

# Set SSH to use gpg-agent
unset SSH_AGENT_PID
if [ "${gnupg_SSH_AUTH_SOCK_by:-0}" -ne $$ ]; then
  export SSH_AUTH_SOCK="/run/user/$UID/gnupg/S.gpg-agent.ssh"
fi
echo "UPDATESTARTUPTTY" | gpg-connect-agent > /dev/null 2&>1

我的一半变成了鱼:

set -e SSH_AGENT_PID
if [ "${gnupg_SSH_AUTH_SOCK_by:-0}" -ne $$ ]
  set -x  SSH_AUTH_SOCK="/run/user/$UID/gnupg/S.gpg-agent.ssh"
end
echo "UPDATESTARTUPTTY" | gpg-connect-agent > /dev/null 2>&1

正如你在上面看到的,到目前为止,我已经用 set -e 转换了 stdin 和 stderror pine 以及 unset 变量,我遇到的错误对我来说有点模糊:

~/.config/fish/config.fish (line 33): ${ is not a valid variable in fish.
if [ "${gnupg_SSH_AUTH_SOCK_by:-0}" -ne $$ ]
       ^
from sourcing file ~/.config/fish/config.fish
        called during startup

任何帮助将不胜感激, 顺便说一句,迁移也很好:)那里有吗?

[edit] 好的,感谢下面的回复,现在我所有的 bash 环境、配置文件、bashrc 等都被翻译成 fish 并 100% 仅用作我的 shell

【问题讨论】:

  • 一个很好的问题是关于一个狭窄的、具体的问题——所以“我如何将程序-X 翻译成语言-Y?”是一个不好的问题,但是“在不触发错误-Z 的情况下,用语言-Y 编写事物-X 的方式是什么?”可以是一个很好的。我已编辑标题以适当缩小范围。
  • 始终指定您正在使用的程序的版本。在这种情况下,fish 3.0 最近发布,它与您的问题与 fish 2.x 有一些差异。
  • 它是 3.0 我编辑了问题对不起。

标签: linux bash shell fish


【解决方案1】:

在您对鱼的语法和行为有更好的理解之前,您不应该更改您的登录 shell。例如,在 fish 中,$$ 的等价物是 %self$fish_pid,具体取决于您使用的 fish 版本。您应该始终指定您遇到问题的程序版本。

假设您使用的 fish 2.x 会写成

if not set -q gnupg_SSH_AUTH_SOCK_by
or test $gnupg_SSH_AUTH_SOCK_by -ne %self
    set -gx SSH_AUTH_SOCK "/run/user/$UID/gnupg/S.gpg-agent.ssh"
end

另外,请注意 set -x 中的 var 名称和值之间没有等号。

【讨论】:

  • 我在 Arch 上使用的是最新版本,所以 3.0 但我想是向后兼容的?
  • 一切正常,谢谢!
【解决方案2】:

由于${var:-value} 扩展为value,如果$var 为空,您可以随时通过编写代码来替换它:

begin
  if test -n "$gnupg_SSH_AUTH_SOCK_by"
    set result "$gnupg_SSH_AUTH_SOCK_by"
  else
    set result 0
  end

  if [ "$result" -ne %self ]
    set -x SSH_AUTH_SOCK "/run/user/$UID/gnupg/S.gpg-agent.ssh"
  end
  set -e result
end

请注意,我不使用 (a) 认可、(b) 宽恕使用或 (c) 未能对 fish 的用户持有无根据的偏见。因此,我的建议非常可疑,而且可能有更好的方法来做到这一点。

【讨论】:

    【解决方案3】:

    我有一个类似的问题,与 XDG_* 变量有关。

    var1="${XDG_CACHE_HOME:-$HOME/.cache}"/foo
    var2="${XDG_CONFIG_HOME:-$HOME/.config}"/foo
    var3="${XDG_DATA_HOME:-$HOME/.local/share}"/foo
    some-command "$var1" "$var2" ...
    

    我发现最好的替代方法是简单地为默认值设置一次通用变量--

    set -U XDG_CACHE_HOME ~/.cache
    set -U XDG_CONFIG_HOME ~/.config
    set -U XDG_DATA_HOME ~/.local/share
    

    然后在fish 配置文件或脚本中,只需使用"$XDG_CONFIG_HOME"/...。如果设置,导出的环境变量的值将覆盖通用变量,否则通用变量作为默认/后备存在。如果使用通用变量,它不会导出到子进程,而导出的环境变量是,它提供了完全等效的 bash|zsh 参数扩展。

    【讨论】:

    • 我的similar question 与此重复,因此我想我会在这里分享我的发现,即使我的回答与所提出的确切问题没有直接关系。
    猜你喜欢
    • 2013-01-16
    • 2016-07-07
    • 1970-01-01
    • 2019-04-04
    • 1970-01-01
    • 1970-01-01
    • 2013-06-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多