请让我知道为什么以下命令在csh模式下工作,而不是在bash中工作。
击:
~ $ cd `ls -ltr | grep ^d | tail -1 | awk '{print $9}'`
bash: cd: synopsys_cache_L-2016.03-SP5: No such file or directory
~ $ pwd
/home/mkumar
更改为csh后:
~ $ csh
CSH > cd `ls -ltr | grep ^d | tail -1 | awk '{print $9}'`
CSH > pwd
/home/mkumar/synopsys_cache_L-2016.03-SP5
答案 0 :(得分:3)
依赖于解析ls
is innately bug-prone的代码。不要这样做。
以下内容有点花哨,重复使用相同的代码来构建cd_newest
和cd_oldest
函数:
cd_by_test() {
local test=$1 dir best_dir=
shift
(( "$#" == 0 )) && set -- */
for dir; do dir=${dir%/}
[[ -d "$dir" ]] || continue
[[ $best_dir ]] || best_dir=$dir
[ "$dir" "$test" "$best_dir" ] && best_dir=$dir
done
if [[ $best_dir ]]; then
cd "$best_dir"
else
echo "No directory found" >&2
fi
}
cd_newest() { cd_by_test -nt "$@"; }
cd_oldest() { cd_by_test -ot "$@"; }
在这里,我们将运算符设置为使用两个比较两个文件,方法是将其分配给$test
函数中的变量cd_by_test
,然后使用[ "$dir" "$test" "$best_dir" ]
应用该运算符。
在最近修订的版本中,我们还可以在特定目录子集之间进行选择:
cd_newest *-test.d/
...将cd
发送到最新的*-test.d
目录。
答案 1 :(得分:2)
zsh
的未经请求的插件(作为理由,如果您只想移动到zsh
以外的其他shell,我建议考虑csh
。
% cd *(/om[1])
% pwd
/home/mkumar/synopsys_cache_L-2016.03-SP5
*
后面的括号包含各种glob 限定符:
/
将匹配限制为目录om
按修改时间对扩展进行排序[1]
仅选择第一场比赛