Linux 什么';fish中的${var:-defaultvalue}等价于什么?

Linux 什么';fish中的${var:-defaultvalue}等价于什么?,linux,bash,shell,fish,Linux,Bash,Shell,Fish,您好,我正在尝试将我的.bashrc格式翻译为fish格式,几乎完成了,文档中的大部分内容都很清楚,但这一部分让我头疼。。所以我的gnupg和我的yubikey ssh等一起工作。。 fish版本是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

您好,我正在尝试将我的.bashrc格式翻译为fish格式,几乎完成了,文档中的大部分内容都很清楚,但这一部分让我头疼。。所以我的gnupg和我的yubikey ssh等一起工作。。 fish版本是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

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


[编辑]由于下面的响应,现在我的所有bash环境、配置文件、bashrc等都被转换为fish,并将其完全用作shell 100%

,因为
${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)对鱼类使用者持有不必要的偏见。因此,我的建议非常可疑,很可能有更好的方法可以做到这一点。

因为
${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语法和行为之前,不应该更改登录shell。例如,在fish中,
$
的等价物是
%self
$fish\u pid
,具体取决于您使用的fish版本。您应该始终指定遇到问题的程序版本

假设您使用的是Fish2.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名称和值之间没有等号,在更好地理解fish语法和行为之前,不应更改登录shell。例如,在fish中,
$
的等价物是
%self
$fish\u pid
,具体取决于您使用的fish版本。您应该始终指定遇到问题的程序版本

假设您使用的是Fish2.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名称和值之间没有等号,我有一个类似的问题,与XDG_*变量有关

var1=“${XDG\u CACHE\u HOME:-$HOME/.CACHE}”/foo
var2=“${XDG\u CONFIG\u HOME:-$HOME/.CONFIG}”/foo
var3=“${XDG\u DATA\u HOME:-$HOME/.local/share}”/foo
某些命令“$var1”$var2”。。。
我发现最好的选择是只为默认值设置一次univeral变量--


然后在fish配置文件或脚本中,只需使用
“$XDG\u config\u HOME”/…
。导出的环境变量的值将覆盖通用变量(如果已设置),否则通用变量将作为默认值/回退值存在。如果使用通用变量,则不会将其导出到子进程,而导出的环境变量则是,它提供了与bash | zsh参数展开完全等效的内容。

我有一个类似的问题,与XDG |变量有关

var1=“${XDG\u CACHE\u HOME:-$HOME/.CACHE}”/foo
var2=“${XDG\u CONFIG\u HOME:-$HOME/.CONFIG}”/foo
var3=“${XDG\u DATA\u HOME:-$HOME/.local/share}”/foo
某些命令“$var1”$var2”。。。
我发现最好的选择是只为默认值设置一次univeral变量--


然后在fish配置文件或脚本中,只需使用
“$XDG\u config\u HOME”/…
。导出的环境变量的值将覆盖通用变量(如果已设置),否则通用变量将作为默认值/回退值存在。如果使用通用变量,则不会将其导出到子进程,而导出的环境变量则是,它提供了与bash | zsh参数展开完全等效的功能。

一个好问题是关于一个狭窄的特定问题——因此“如何将program-X转换为language-Y?”是一个坏问题,但是“在不触发错误-Z的情况下,用语言-Y写东西-X的方式是什么?“这可能是个好主意。我已编辑标题以适当缩小范围。请始终指定您正在使用的程序的版本。在本例中,fish 3.0最近发布,它与fish 2.x中的问题有一些不同。这是3.0我编辑了这个问题对不起。一个好的问题是关于一个狭窄的、具体的问题——“如何将program-x翻译成language-Y?”是一个坏问题,但是“在不触发错误-Z的情况下,用语言-Y写东西-X的方式是什么?“这可能是个好主意。我已编辑标题以适当缩小范围。请始终指定您正在使用的程序的版本。在这种情况下,fish 3.0最近发布,它与fish 2.x中的问题有一些不同。它是3.0,我编辑了这个问题。对不起。我使用的是arch so 3.0上的最新版本,但我认为它是向后兼容的?我已经完成了所有工作,谢谢!我正在使用arch so 3.0上的最新版本,但我想它是向后兼容的吗?我已经全部工作完毕,谢谢!我的答案与所问的问题没有直接关系,所以我想我会在这里分享我的发现。我的答案与所问的问题没有直接关系。我的答案与所问的问题没有直接关系,所以我想我会在这里分享我的发现。