代码之家  ›  专栏  ›  技术社区  ›  JohnE

在平铺之前展开变量

  •  3
  • JohnE  · 技术社区  · 7 年前

    $ omar=xyz123
    $ echo ~$omar
    

    输出看起来很好:

    ~xyz123
    

    $ ls ~$omar
    

    有一个错误:

    ls: cannot access ~xyz123: No such file or directory
    

    How to manually expand a special variable (ex: ~ tilde) in bash

    2 回复  |  直到 7 年前
        1
  •  3
  •   glenn jackman    7 年前

    bash扩展tilde 之前 https://www.gnu.org/software/bash/manual/bash.html#Shell-Expansions

    shell将查看文本字符 $ o m a r 是一个登录名。因为它们不是,所以波浪线不会展开。外壳最终会看到 $omar 作为一个变量,并替换它。然后,它将扩展的单词交给用户 ~xyz123 echo 它只是打印出来的。

    同样地,它也传递了这个词 ~xyz123 到 ls . 由于ls不进行自己的tilde扩展,因此它正在当前目录中查找名为 ~xyz123 用平铺文字。因为这样的文件不存在,所以会出现该错误。

    如果你愿意 ls ~$var 要列出文件,您需要 eval ls ~$var

    ls "$(getent passwd "$omar" | cut -d: -f6)"
    
        2
  •  0
  •   Jonathan Leffler    7 年前

    我会去看看 "$omar" 是具有以下权限的有效用户: id 然后使用 eval 评估 然后去做。

    if ! id "$omar" >/dev/null 2>&1; 
       echo "Error: user with the name $omar does not exist!" >&2
       exit 1
    fi
    eval echo "\"~$omar\""
    
    推荐文章