Path 如何从tcsh中的路径中删除文件名?

Path 如何从tcsh中的路径中删除文件名?,path,tcsh,Path,Tcsh,在tcsh中给定此变量: set i = ~/foo/bar.c 如何仅获取$I的目录部分 ~/foo 如果系统提供“dirname”命令,则可以: set i = `dirname ~/foo/bar.c` echo $i 请注意变量名称前面缺少的$。但此解决方案与shell无关。使用dirname命令,例如: set i = `dirname "~/foo/bar.c"` 请注意路径周围的引号。把它们包括在内是很重要的。如果跳过引号,dirname对于包含空格的路径将失败。请注意,~

在tcsh中给定此变量:

set i = ~/foo/bar.c
如何仅获取
$I
的目录部分

~/foo

如果系统提供“dirname”命令,则可以:

set i = `dirname ~/foo/bar.c`
echo $i

请注意变量名称前面缺少的$。但此解决方案与shell无关。

使用
dirname
命令,例如:

set i = `dirname "~/foo/bar.c"`
请注意路径周围的引号。把它们包括在内是很重要的。如果跳过引号,
dirname
对于包含空格的路径将失败。请注意,
~/
表达式在执行
dirname
之前进行计算,因此,如果不使用引号且主路径包含空格,即使这样简单的示例也可能失败


当然,同样的问题也适用于所有其他命令,最好的做法是总是将参数用引号括起来。

我在这里等待答案时发现的方法是:

echo $i | awk -F"/" '{$NF="";print}' OFS="/"
set i = ~/foo/bar.c
echo $i:h
结果:

~/foo

要完全获取文件名,请使用basename命令完成:

set j = `basename ~/foo/bar.c`
echo $j

以下是与上面不同的内容:
可在tcsh中使用,但其他外壳很少

> set i = ~/foo/bar.c
> echo ${i:t}
bar.c
> echo ${i:h}
/home/erflungued/foo
确实要使用
dirname“$i”
,而不要使用
${i:h}

如果
$i
仅包含文件名(无路径),而在这种情况下
dirname
正确返回当前目录,则后者不会产生预期的结果

> set i = bar.c
> echo ${i:h}
bar.c
> dirname "$i"
.