unix shell 中 2 个别名 cd 之间的行为差​​异

我通过 VNC 连接到远程计算机并使用 Konsole 进行工作。 Konsole 是使用 KDE 4.3.4 的 2.3.3 版。我有这两个别名:

alias ll  'ls -haltr; pwd'
alias cd  'cd \!*; ll'

我观察到有以下行为:

  1. 当路径存在时,它会cd到它并做ll别名
  2. 当路径不存在时,它只会说路径不存在并且不再执行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。我复制了相同的两个别名,但我现在观察到了不同的行为:

  1. 当 path 存在时,它会 cd 到它并且还做 ll 别名(基本上与上面的 #1 相同)
  2. 当路径不存在时,它会尝试 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 之前首先检查路径是否存在”但无济于事。 :'(

编辑:
我使用的外壳是 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
iCMS 回答:unix shell 中 2 个别名 cd 之间的行为差​​异

问题中的信息仍不足以找出为什么 tcsh 在两种工作环境中的行为不同。

别名定义了一个没有任何条件的命令序列(cd 后跟 ll)。

alias cd  'cd \!*; ll'

在一个系统上,如果 cd 命令由于当前未知原因报告错误,则别名的执行似乎停止。

ll 命令失败后阻止执行 cd 的正确方法是有条件地执行 ll 命令,例如

alias cd  'cd \!* && ll'
,

长达十年的建议是:不要使用别名,使用函数。

ll() { ls -haltr "$@" && pwd; }
cd() { cd "$@" && ll; }
本文链接:https://www.f2er.com/184525.html

大家都在问