【问题标题】:Fish: for loop: Too many args for cd command鱼:for循环:cd命令的参数太多
【发布时间】:2020-09-18 20:53:03
【问题描述】:

如果我运行脚本

#!/usr/bin/fish
cd /home/user/repos/repo1
pwd

按预期工作(更改目录并打印该路径)。

当我将相同的逻辑放入 for 循环时,cd 抱怨参数太多,即使没有空格和 .

#! /usr/bin/fish

set REPOS "/home/user/repos/repo1" "/home/user/repos/repo1"

for REPO_PATH in $REPOS:
    echo $REPO_PATH
    cd $REPO_PATH
    pwd
end

使用相对路径没有帮助,

set REPOS "~/repos/repo1" "~/repos/repo1"

使用不带引号的变量在 for 循环外有效,在 for 循环内同样适用。

像这样在 bash 中工作

#!/bin/bash
repos=("/home/user/repos/repo1" "/home/user/repos/repo1")
for path in "${repos[@]}"
do
    cd $path
    pwd
done

我已经阅读了 fish 文档的列表和循环部分。 我注意到 cd 有一个鱼包装。这可能是问题吗?

【问题讨论】:

  • : 不正确,应删除;它将: 附加到每个目录名称。不过,这似乎与您报告的错误无关。
  • 数据不足。一方面,您实际上并没有向我们展示运行脚本的输出。此外,正如@chepner 指出的for 语句上的尾随冒号是错误的——这将导致每个目录都附加一个冒号。您还应该将 echo $REPO_PATH 替换为 set --show REPO_PATH,以明确 var 包含多少个值。

标签: for-loop fish cd


【解决方案1】:

去掉冒号。

显示错误“参数过多”的原因是调用变量“...PATH”会导致fish将其解释为路径变量,这意味着它将在“:”上拆分(如$PATH , $LD_LIBRARY_PATH 等)。

所以 fish 将 $REPO_PATH 设置为“/home/user/repos/repo1:”,然后将其拆分为“:”,使其成为“/home/user/repos/repo1”和“”的列表.

然后将其作为两个参数传递给cd,一个为空,cd 抱怨有第二个虚假参数。

所以就用

set REPOS "/home/user/repos/repo1" "/home/user/repos/repo1"

for REPO_PATH in $REPOS
    echo $REPO_PATH
    cd $REPO_PATH
    pwd
end

【讨论】:

  • 但是为什么echo $REPO_PATH 不能同时打印呢?我只能看到 repo 变量而不是冒号。
  • 哦,我明白了,因为它是空的$REPO_PATH: set in local scope, unexported, with 2 elements $REPO_PATH[1]: length=38 value=|/home/user/repos/repo1| $REPO_PATH[2]: length=0 value=|| $REPO_PATH: not set in global scope $REPO_PATH: not set in universal scope Too many args for cd command
猜你喜欢
  • 2016-02-06
  • 2023-03-20
  • 2018-12-18
  • 1970-01-01
  • 2020-03-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-08-05
相关资源
最近更新 更多