【问题标题】:shell alias executes in home directoryshell 别名在主目录中执行
【发布时间】:2021-01-25 10:34:47
【问题描述】:

我的.zshrc 文件中有以下行:

alias clean="sed -i 's/\r//g; s/    /\t/g' $(find . -maxdepth 1 -type f)"

但是当我尝试在/path/to/some/directory 中执行它时,输出是:

sed ./.Xauthority
./.lesshst: No such file or directory

.Xauthority.lesshst 都在我的主目录中。

$(pwd) 替换. 没有帮助。

【问题讨论】:

  • 你使用哪个外壳?

标签: bash sed find sh pwd


【解决方案1】:

在定义别名时,您使用双引号来包含整个(别名)定义。这具有在定义别名时实际运行find 命令的效果。

因此,当创建别名时,它会从定义别名的目录中获取文件列表(例如,在获取 .zshrc 时在您的主目录中)。

您可以在以下示例中看到这种情况:

$ cd /tmp

$ pwd
/tmp

$ ls -l
total 36036
drwxrwxrwt+ 1 myid None                  0 Oct 10 11:31 ./
drwxr-xr-x+ 1 myid None                  0 Jul 12 17:28 ../
-rw-r--r--  1 myid Administrators        0 Oct 10 11:31 a
-rw-r--r--  1 myid Administrators        0 Oct 10 11:31 b
-rw-r--r--  1 myid Administrators        0 Oct 10 11:31 c
-rw-r--r--  1 myid Administrators        0 Oct 10 11:31 d
-rw-r--r--  1 myid Administrators 36864002 Jun  6 17:29 giga.txt
drwx------+ 1 myid Administrators        0 Mar  8  2020 runtime-xward/

$ alias clean="sed -i 's/\r//g; s/    /\t/g' $(find . -maxdepth 1 -type f)"
$ alias clean
alias clean='sed -i '\''s/\r//g; s/    /\t/g'\'' ./a
./b
./c
./d
./giga.txt'

注意find 在别名定义时是如何被评估的,并拉入了我的/tmp 目录中的所有文件。

要解决此问题,您需要确保在创建别名时评估 find

有几种方法可以做到这一点,一个想法是将定义的 find 部分用单引号括起来,另一个想法是保留当前的双引号并转义 $,例如:

$ alias clean="sed -i 's/\r//g; s/    /\t/g' "'$(find . -maxdepth 1 -type f)'
$ alias clean
alias clean='sed -i '\''s/\r//g; s/    /\t/g'\'' $(find . -maxdepth 1 -type f)'

$ alias alias clean="sed -i 's/\r//g; s/    /\t/g' \$(find . -maxdepth 1 -type f)"
$ alias clean
alias clean='sed -i '\''s/\r//g; s/    /\t/g'\'' $(find . -maxdepth 1 -type f)'

请注意,在这两种情况下,别名都包含实际的find 命令,而不是在当前目录中对其进行评估的结果。

【讨论】:

    猜你喜欢
    • 2012-10-04
    • 1970-01-01
    • 2021-07-27
    • 2015-06-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-22
    • 2015-07-26
    相关资源
    最近更新 更多