Linux 什么';fish中的${var:-defaultvalue}等价于什么?
您好,我正在尝试将我的.bashrc格式翻译为fish格式,几乎完成了,文档中的大部分内容都很清楚,但这一部分让我头疼。。所以我的gnupg和我的yubikey ssh等一起工作。。 fish版本是Arch GNU/Linux下的最新3.0版本 BASH上的原始版本: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
# 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上的最新版本,但我想它是向后兼容的吗?我已经全部工作完毕,谢谢!我的答案与所问的问题没有直接关系,所以我想我会在这里分享我的发现。我的答案与所问的问题没有直接关系。我的答案与所问的问题没有直接关系,所以我想我会在这里分享我的发现。