Bash 软链接和awk脚本(路径问题)

Bash 软链接和awk脚本(路径问题),bash,awk,path,symlink,Bash,Awk,Path,Symlink,我有main.sh和external.awk文件 它们在同一个目录中 从main.sh我调用外部awk脚本如下: awk -f external.awk .. 当然,它正在发挥作用 现在当我这样做的时候: cd /usr/local/bin sudo ln -s /path/to/scripts/dir/main.sh main.sh sudo ln -s /path/to/scripts/dir/external.awk external.awk 我可以从我所在的任何目录调用我的main.

我有
main.sh
external.awk
文件

它们在同一个目录中

main.sh
我调用外部awk脚本如下:

awk -f external.awk ..
当然,它正在发挥作用

现在当我这样做的时候:

cd /usr/local/bin
sudo ln -s /path/to/scripts/dir/main.sh main.sh
sudo ln -s /path/to/scripts/dir/external.awk external.awk
我可以从我所在的任何目录调用我的
main.sh
。 但是它给了我一个错误,就是找不到
external.awk
脚本

为什么链接在这种情况下不起作用,不是吗

awk -f external.awk ..
相对于它所在的文件夹调用
external.awk
,因此在本例中调用
/usr/local/bin
路径中的符号链接

编辑

发布我的问题后不久,我发现这是处理这种情况的一个好方法:


它不符合POSIX,但在这种情况下,它对我来说并不重要。

修改main.sh以调用awk,如下所示:

awk -f /usr/local/bin/external.awk ..

不,它将尝试从当前目录调用AWK脚本,而不是从shell脚本所在的目录调用。请参阅,例如,找到一种解决方法。是否有一种方法可以设置
路径
,以便以这种方式找到
外部.awk
?它适用于shell脚本,因为shell使用
$path
查找要运行的程序。它不适用于
awk
,因为
-f
的参数是指向脚本文件的路径名。当您在同一目录中时,
external.awk
是当前目录中的文件名。当您在其他地方时,
-f external.awk
仍然指定
/external.awk
,但该文件不存在。如果您有一个脚本
pathfile
,它在路径上查找文件,则可以使用
awk-f$(pathfile external.awk).
为您定位文件。如果你没有这样的脚本,你可以写一个。@JoachimPileborg我认为这可能是解决这个问题的更好、更干净的方法。它显然适用于
gawk
,但这正是我正在使用的。+1用于发现和记录GNU
awk
的AWKLIBPATH。它正是您想要的,如果您总是使用GNU
awk
,那么使用它是有意义的。