shell 别名在主目录中执行
shell alias executes in home directory
我的 .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)
替换 .
没有帮助。
定义别名时,您使用双引号将整个(别名)定义括起来。在定义别名时,这实际上具有 运行 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
命令,而不是在当前目录中对其进行评估的结果。
我的 .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)
替换 .
没有帮助。
定义别名时,您使用双引号将整个(别名)定义括起来。在定义别名时,这实际上具有 运行 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
命令,而不是在当前目录中对其进行评估的结果。