![tcsh :源文件的路径](https://linux22.com/image/512976/tcsh%20%EF%BC%9A%E6%BA%90%E6%96%87%E4%BB%B6%E7%9A%84%E8%B7%AF%E5%BE%84.png)
我正在 tcsh 下获取一个文件。此文件可能位于文件系统上的任何位置。我如何检索源文件的路径?
$0 不起作用 : 我不执行该文件,我来源它。
非常感谢 !
答案1
如果您不想使用lsof
,请仅对 csh 使用以下内容。
set script_path = `ls -l /proc/$$/fd | sed -e 's/^[^/]*//' | grep "/script_name"`
$$
是当前正在运行的线程的 pid。
不管通过哪种方式(用户调用或者其他脚本调用),脚本都会被打开,所以过滤fd的内容就可以得到脚本的真实路径。
当脚本软链接到其他路径时这也有效!
答案2
稍微搜索一下就能得到我想要的东西。
有一件事我很确定:文件的基本名称(而不是整个路径)。在我的例子中,是 source_me.tcsh。因此,我们可以查询 lsof 以获取当前 shell PID 并 grep 绝对路径。
$$ 为您提供 PID。
/usr/sbin/lsof +p $$ | grep -oE /.\*source_me.tcsh
答案3
您可以尝试以下方法,该方法应该可以在普通 (t)csh 中工作。我不知道它是否也可以在 .(t)cshrc 中工作:
#!/bin/csh
set DUS = ( $_ ) #DUS: Dollar UnderScore
set DNU = $0:q #DNU: Dollar NUll
if (( $#DUS > 1 )) then
if ("${DUS[1]}" == 'source' || "$DNU:t" == 'tcsh' || "$DNU:t" == 'csh') then
set DNU = ${DUS[2]:q}
endif
endif
echo 'Your script path is: '`(cd "$DNU:h" >&! /dev/null; pwd)`
echo 'your script name is: '$DNU:t
答案4
虽然这在其他贝壳,我看不出有什么办法可以做到这一点tcsh
。