我试图了解该set
命令在 fish shell 上是如何工作的。
例如,要删除问候消息,鱼手册建议:
要清空文本,使用默认的问候语功能:
set -U fish_greeting
或者
set -g fish_greeting
在 config.fish 中。
但为什么建议使用set -g fish_greeting
inconfig.fish
而不是 just set fish_greeting
?这里的实际目的是什么-g
?
我试图了解该set
命令在 fish shell 上是如何工作的。
例如,要删除问候消息,鱼手册建议:
要清空文本,使用默认的问候语功能:
set -U fish_greeting
或者
set -g fish_greeting
在 config.fish 中。
但为什么建议使用set -g fish_greeting
inconfig.fish
而不是 just set fish_greeting
?这里的实际目的是什么-g
?
在我开始之前,我知道这可能是最好在 git-hub 上打开的问题,但是;
a. 这只是小事
b. 反斜杠的功能已在之前已关闭的问题中概述,但空格尚未概述(请参阅此处)
c. 作为新用户,我无法在 git-hub 上打开问题
d. 它可以通过谷歌索引帮助新手。
请随意代表我创建一个 git-hub 问题。
考虑以下代码;
# Our fish :)
set fishies \
">('>" \
"><=*>" \
">-<==*>" \
">==(--v-*);->" \
"><>" \
"><(((º>" \
">-<===*>" \
">(̠̄:̠̄ >" \
">><((( ◉ >"
# Usage ; set fish (getfish) && echo $fish
function getfish
# Set our fish to a random item from the "fishies" list
set -l fish $fishies[(random 1 (count $fishies))]
# Return our fish to the STDOUT
echo $fish
end
这很好。但是,如果我们在任何反斜杠(“\__”(用下划线 (_) 表示))后面添加空格,则其下方的行将不会传递给命令set fishes
。
这是一个正确的行为吗?是否有关于反斜杠如何工作的文档,因为我只是在修修补补时偶然发现这一点?
重申一下,有人能向我解释为什么会出现这种行为吗?
关于反斜杠,我发现最多的(我认为)是上述 git-hub 问题中的以下代码(但我不完全理解它);
It (the usage of a backslash to form a new-line) has been special cased in tokenizer.cpp:539 :
if ((*(tok->buff) == L'\\') &&(*(tok->buff+1) == L'\n'))
{
tok->last_pos = tok->buff - tok->orig_buff;
tok->buff+=2;
tok->last_type = TOK_END;
return;
}
如果这篇文章写得幼稚/不好,我深表歉意,因为我是一名新用户,并且不活跃。我想发表一下我的看法,希望能帮助其他遇到同样问题的新手,这是一个很棒的小功能,也是一个很棒的小工具,如果不记录这种行为,那将是一种遗憾,因为它在编写长命令/字符串时非常有用。
我几年前尝试过 fish shell,但由于现在已经忘记的原因而放弃了它(有些事情我无法用它做)。
我再次寻找鱼并尝试更新我的旧脚本以使用最新版本,但遇到了一个问题。
我的一个旧脚本定义了一个带有--shadow-builtin
选项的函数。该选项不再存在。什么可以替代其功能?
我正在运行 Fish 版本 3.7.0,我想编写一个函数来根据索引从列表中删除元素。
例如,我想从 PATH 环境变量中删除索引 2 处的元素:
set -l variable_name PATH
set -l index 2
set -e $variable_name[$index]
然而,下面的语句不起作用,它返回:
set: --erase: 选项需要一个参数
我发现它需要一些惰性评估来获取变量名称(例如 PATH),但我不知道如何做到这一点。
我试图理解为什么 gradle 完成不适用。
由于gw
似乎是完成的关键字,我创建了一个别名:
alias gw='./gradlew'
(我的项目使用 gradle 包装器。我没有全局安装 gradle。)
当我输入它时gw <tab>
,它只是完成标准文件系统完成。我期待更多类似打字时的事情git <tab>
。
我缺少什么?
我正在尝试设置一个环境变量编辑器并将其更改为默认值,但由于这种行为
/usr/bin/nano
我无法使用鱼常见问题解答set -Ux
如何找出fish继承的是哪个设置?(这样我就可以改变它)
编辑:
/etc/environment
为空
set -S EDITOR
$EDITOR: set in global scope, exported, with 1 elements
$EDITOR[1]: |/usr/bin/nano|
$EDITOR: set in universal scope, exported, with 1 elements
$EDITOR[1]: |/usr/bin/nvim|
$EDITOR: originally inherited as |/usr/bin/nano|
当使用我拼凑的一个小鱼功能(不是这里的开发人员,所以请温柔......?)访问一些经常需要的 ssh 主机时,我看到一个奇怪的效果:括号粘贴模式被激活SSH 会话。
这是脚本:
function mssh
set hosts host1 host2 host3 hostn
set domain mydomain.com
set user myusername
set number (count $hosts)
set numlength (string length $number)
echo
echo "Hosts:"
echo
for i in (seq $number)
if test (string length "$i") -lt "$numlength"
echo \t" "$i")" $hosts[$i]
else
echo \t$i")" $hosts[$i]
end
end
echo
while read --nchars $numlength -l response --prompt-str="Please select: "; or return 1
if test "$response" -le "$number" 2>/dev/null
ssh $user@$hosts[$response].$domain
break
else
echo "Invalid selection"
continue
end
end
end
有了这个,只是为了上下文,我基本上是在尝试重现这个 zsh 脚本的功能(我从某个地方得到的):
#!/bin/zsh
hosts=(host1 host2 host3)
domain="mydomain.com"
user="username"
PS3='Select: '
select host in ${hosts[@]}
do
if [ "$host" = "" ]; then
echo "Invalid selection."
else
ssh ${user}@${host}.${domain}
break
fi
done
但正如我在开头提到的,我自己的脚本在使用它时似乎有些错误,它会为 ssh 会话打开鱼括号粘贴模式,并且我粘贴的所有内容都包含在波浪字符 ( ) 中~paste example~
。
它发生在 iTermin2和macOS 终端客户端中。
zsh 脚本不会发生这种情况(或者当我直接调用 ssh 时)。
欢迎任何关于我哪里出错的指示。提前致谢。
我有一个 bash 脚本,它cat
是一个 heredoc 字符串,我在鱼壳中运行它,然后将它传递给一个source
调用,如下所示:
~/foo/baz:
1 #!/usr/bin/env bash
2
3 cat << EOS
4 function bar
5 echo 'Hello world'
6 end
7 EOS
从鱼壳:
richiethomas@richie ~/foo (master) [126]> ./baz | source
richiethomas@richie ~/foo (master)> bar
Hello world
如上所示,这导致bar
我运行时可以调用该函数./baz | source
。
但是,当我将bar
函数的实现更改为以下内容时出现错误:
1 #!/usr/bin/env bash
2
3 cat << EOS
4 function bar
5 set myVar 5
6 switch $myVar
7 case 4
8 echo '4'
9 case 5
10 echo '5'
11 case '*'
12 echo 'Not found'
13 end
14 end
15 EOS
当我尝试source
这样做时,我收到以下错误:
richiethomas@richie ~/foo (master) [0|1]> ./baz | source
- (line 1): Missing end to balance this function definition
function bar
^
from sourcing file -
source: Error while reading file '<stdin>'
当我将其直接粘贴到鱼壳中时,等效的函数 + switch 语句可以正常工作:
richiethomas@richie ~/foo (master) [0|1]> function bar
set myVar 5
switch $myVar
case 4
echo 'it is 4!'
case 5
echo 'it is 5!'
case '*'
echo 'not found'
end
end
richiethomas@richie ~/foo (master)> bar
it is 5!
我end
在文件和复制/粘贴到 shell 中的代码中都有相同的语句数baz
,所以我怀疑错误语句是红鲱鱼?如果是这样,我不知道真正的错误可能是什么。
我的目标是能够在 bash 脚本的 heredoc 字符串中构造一个 fish 函数,然后从 fish 脚本中获取该 bash 脚本,以便我可以调用该函数。我在这里哪里做错了?
我正在研究 RBENV 代码库,我看到在文件的第 116 行rbenv-init
,创建了一个包含switch
语句的函数。我的假设是我们检查变量的值是否是(复数)变量command
中值数组的成员之一。commands
如果是,我们执行 switch 语句的分支 1。否则,我们执行分支 2。
我想写一个简单的脚本来测试我的假设,所以我写了以下内容:
#!/usr/bin/env fish
set command "foo"
switch $command
case ${argv[*]}
echo "command in args"
case "*"
echo "command not found"
end
但是,当我运行此脚本时,出现以下错误:
$ ./foo bar baz
./foo (line 6): ${ is not a valid variable in fish.
case ${argv[*]}
^
warning: Error while reading file ./foo
我期待评估一个包含andargv
的数组,因为这是我提供给脚本的两个参数。我的语法与源代码(即)中第 117 行的语法相匹配。bar
baz
case ${commands[*]}
我在其中执行脚本的外壳是 zsh v5.8.1,但是我的 shebang 专门引用了“鱼”外壳,所以我认为我的外壳无关紧要。我已经安装了鱼 v3.5.1,fwiw。
我尝试使用 切换fish 中的语言(例如,shell 支持的法语)sudo dpkg-reconfigure locales
,但没有任何改变。
导出LANG
变量做set --global --export LANG fr_FR.UTF-8
和启动子鱼实例也没有效果。locale
输出是:
LANG=fr_FR.UTF-8
LANGUAGE=
LC_CTYPE="fr_FR.UTF-8"
LC_NUMERIC="fr_FR.UTF-8"
LC_TIME="fr_FR.UTF-8"
LC_COLLATE="fr_FR.UTF-8"
LC_MONETARY="fr_FR.UTF-8"
LC_MESSAGES="fr_FR.UTF-8"
LC_PAPER="fr_FR.UTF-8"
LC_NAME="fr_FR.UTF-8"
LC_ADDRESS="fr_FR.UTF-8"
LC_TELEPHONE="fr_FR.UTF-8"
LC_MEASUREMENT="fr_FR.UTF-8"
LC_IDENTIFICATION="fr_FR.UTF-8"
LC_ALL=
更改鱼壳语言需要哪些操作?