unix 中 2 个别名 cd 之间的行为差异 shell
Difference in behavior between 2 aliased cds in unix shell
我通过 VNC 连接到远程计算机并使用 Konsole 进行工作。 Konsole 是使用 KDE 4.3.4 的 2.3.3 版。我有这两个别名:
alias ll 'ls -haltr; pwd'
alias cd 'cd \!*; ll'
我观察到有以下行为:
- 当路径存在时,它将
cd
指向它并且还会做ll
别名
- 当路径不存在时,它只会说路径不存在并且不会再执行
ll
示例:
路径存在
[10] % cd foo
total 14K
-rw-r----- 1 user group 913 Jun 3 2014 readme
-rw-r----- 1 user group 1.2K Dec 3 2020 report.txt
drwxr-x--- 2 user group 4.0K Jan 12 17:50 ./
drwx------ 77 user group 8.0K Jun 24 11:57 ../
/home/user/foo
[11] %
路径不存在
[10] % cd nowhere
nowhere: No such file or directory.
[11] %
现在我们的部门已经转移到另一个部门,我们刚刚开始通过 Exceed TurboX 进行远程连接。我仍然使用 Konsole,但现在使用 KDE 4.10.5 的版本是 2.10.5。我复制了相同的两个别名,但我现在观察到不同的行为:
- 当路径存在时,它会
cd
并做 ll
别名(与上面的#1 基本相同)
- 当路径不存在时,它将尝试
cd
AND 仍然执行 ll
(不同 如上 #2)
那么对于 #2,它是这样的:
[10] % cd nowhere
nowhere: No such file or directory.
total 120K
-rw-r----- 1 user group 272 Jan 6 2021 .cshrc
-rw-r----- 1 user group 1.2K Jan 6 2021 .alias
drwxr-x--- 2 user group 4.0K Jan 12 17:50 ./
drwx------ 77 user group 8.0K Jun 24 11:57 ../
/home/user
[11] %
我想知道如何将以前工作环境的行为 #2 应用到当前工作环境。
我已经添加了有关 Konsole 和 KDE 版本的信息,因为如果行为是由于版本引起的并且没有解决方法,那么我将在这个新的远程桌面上工作的余生感到难过环境。 ^_^
我目前正在探索“在执行 ll
之前首先检查路径是否存在”但无济于事。 :'(
编辑:
我使用的 shell 是 tcsh
% printenv SHELL
在两种环境中显示 /bin/tcsh
此外:
旧环境
% echo $version
tcsh 6.17.00 (Astron) 2009-07-10 (x86_64-unknown-linux) options wide,nls,dl,al,kan,sm,rh,color,filec
新环境
% echo $version
3
十年之久的建议是:不要使用别名,使用函数。
ll() { ls -haltr "$@" && pwd; }
cd() { cd "$@" && ll; }
问题中的信息仍然不足以找出为什么 tcsh
在两个工作环境中表现不同。
别名定义了一系列命令(cd
后跟 ll
),没有任何条件。
alias cd 'cd \!*; ll'
在一个系统上,如果 cd
命令因当前未知原因报告错误,别名的执行似乎会停止。
在 cd
命令失败后阻止执行 ll
的正确方法是有条件地执行 ll
命令,例如
alias cd 'cd \!* && ll'
我通过 VNC 连接到远程计算机并使用 Konsole 进行工作。 Konsole 是使用 KDE 4.3.4 的 2.3.3 版。我有这两个别名:
alias ll 'ls -haltr; pwd'
alias cd 'cd \!*; ll'
我观察到有以下行为:
- 当路径存在时,它将
cd
指向它并且还会做ll
别名 - 当路径不存在时,它只会说路径不存在并且不会再执行
ll
示例:
路径存在
[10] % cd foo
total 14K
-rw-r----- 1 user group 913 Jun 3 2014 readme
-rw-r----- 1 user group 1.2K Dec 3 2020 report.txt
drwxr-x--- 2 user group 4.0K Jan 12 17:50 ./
drwx------ 77 user group 8.0K Jun 24 11:57 ../
/home/user/foo
[11] %
路径不存在
[10] % cd nowhere
nowhere: No such file or directory.
[11] %
现在我们的部门已经转移到另一个部门,我们刚刚开始通过 Exceed TurboX 进行远程连接。我仍然使用 Konsole,但现在使用 KDE 4.10.5 的版本是 2.10.5。我复制了相同的两个别名,但我现在观察到不同的行为:
- 当路径存在时,它会
cd
并做ll
别名(与上面的#1 基本相同) - 当路径不存在时,它将尝试
cd
AND 仍然执行ll
(不同 如上 #2)
那么对于 #2,它是这样的:
[10] % cd nowhere
nowhere: No such file or directory.
total 120K
-rw-r----- 1 user group 272 Jan 6 2021 .cshrc
-rw-r----- 1 user group 1.2K Jan 6 2021 .alias
drwxr-x--- 2 user group 4.0K Jan 12 17:50 ./
drwx------ 77 user group 8.0K Jun 24 11:57 ../
/home/user
[11] %
我想知道如何将以前工作环境的行为 #2 应用到当前工作环境。
我已经添加了有关 Konsole 和 KDE 版本的信息,因为如果行为是由于版本引起的并且没有解决方法,那么我将在这个新的远程桌面上工作的余生感到难过环境。 ^_^
我目前正在探索“在执行 ll
之前首先检查路径是否存在”但无济于事。 :'(
编辑:
我使用的 shell 是 tcsh
% printenv SHELL
在两种环境中显示 /bin/tcsh
此外:
旧环境
% echo $version
tcsh 6.17.00 (Astron) 2009-07-10 (x86_64-unknown-linux) options wide,nls,dl,al,kan,sm,rh,color,filec
新环境
% echo $version
3
十年之久的建议是:不要使用别名,使用函数。
ll() { ls -haltr "$@" && pwd; }
cd() { cd "$@" && ll; }
问题中的信息仍然不足以找出为什么 tcsh
在两个工作环境中表现不同。
别名定义了一系列命令(cd
后跟 ll
),没有任何条件。
alias cd 'cd \!*; ll'
在一个系统上,如果 cd
命令因当前未知原因报告错误,别名的执行似乎会停止。
在 cd
命令失败后阻止执行 ll
的正确方法是有条件地执行 ll
命令,例如
alias cd 'cd \!* && ll'