我正在运行 Fish 版本 3.7.0,我想编写一个函数来根据索引从列表中删除元素。
例如,我想从 PATH 环境变量中删除索引 2 处的元素:
set -l variable_name PATH
set -l index 2
set -e $variable_name[$index]
然而,下面的语句不起作用,它返回:
set: --erase: 选项需要一个参数
我发现它需要一些惰性评估来获取变量名称(例如 PATH),但我不知道如何做到这一点。
我正在运行 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=
更改鱼壳语言需要哪些操作?
在切换到 fish shell 之前,我经常在zsh
with中使用各种命令which some_command
。一个例子可能是:
$ file `which zsh`
/opt/local/bin/zsh: Mach-O 64-bit executable arm64
/bin/zsh: Mach-O universal binary with 2 architectures: [x86_64:Mach-O 64-bit executable x86_64
- Mach-O 64-bit executable x86_64] [arm64e:Mach-O 64-bit executable arm64e
- Mach-O 64-bit executable arm64e]
/bin/zsh (for architecture x86_64): Mach-O 64-bit executable x86_64
/bin/zsh (for architecture arm64e): Mach-O 64-bit executable arm64e
当我尝试使用fish
它失败时:
$ which zsh
/opt/local/bin/zsh
$ file `which zsh`
`which: cannot open ``which' (No such file or directory)
zsh`: cannot open `zsh`' (No such file or directory)
fish
知道为什么这与其他更像 bash 的 shell 相比不起作用吗?
正如https://stackoverflow.com/a/2763014/2891692中所解释的,
我在我的配置文件中创建了好几天的别名~/.config/fish/config.fish
,它可以工作。
我今天添加的每个新别名都不起作用。
不工作别名的示例:
alias bla = "cd ~/Desktop"
alias bla2 = "ls -a"
但是我今天之前添加的别名。例如:
alias gitStatus="git status"
满~/.config/fish/config.fish
这里:
function fish_greeting
echo 'try nr 5'
end
alias bla2 = "ls -a"
alias gitStatus="git status"
每次尝试我都会更新欢迎信息。这行得通
我该如何解决这个问题?
如果使用alias bla = "cd ~/Desktop"
bla
Command 'bla' not found, did you mean:
command 'bls' from deb bacula-sd (9.4.2-2ubuntu5)
...
如果别名的类型部分首先是红色。但这不是错误(首先让我感到困惑)
Kubuntu 20.04
KDE Plasma Version: 5.18.8
KDE Frameworks Version: 5.68.0
Qt Version: 5.12.8
Kernel Version: 5.13.0-41-generic
OS Type: 64-bit
与这篇文章相关,cd 到最近修改的子目录
重击cd "$(\ls -1dt ./*/ | head -n 1)"
zsh cd ./*(/om[1])
更改到最近修改的目录。
但是fish shell没有脚本。
在 config.fish 中使用 bash 代码时,它显示
$(...) is not supported. In fish, please use '(\ls)'
有人可以帮忙吗?