我知道我的主题有点令人困惑,但这就是我想做的事情。
我有一个文件,我想在我的主目录
我有一个文件,我想在我的主目录
~/bin
中创建一个链接,但当我执行符号链接的文件时,该文件需要其目录中的另一个文件。因此,它无法运行,因为找不到其他文件。我该怎么办?好的,你有两个简单的解决方案。
编辑shell脚本,将其指向文件的绝对路径,而不仅仅是basename。
./path/to/file.sh
VS
file.sh
因此,像这样的命令可以实现你想要的功能。sed -i 's|file.sh|./path/to/file.sh|g' ~/bin/script.sh
它搜索你的符号链接文件(在本例中为script.sh),并将对file.sh的调用替换为./path/to/file.sh。请注意,你经常会看到sed
使用/作为分隔符。但它几乎可以使用任何分隔符,如果你想在这里使用/,则需要对它们进行转义。/。你可能还想考虑转义.(句点),但在这种情况下不必要。如果你是sed
新手,请意识到-i
标志意味着它将直接在文件中进行编辑。最后,请意识到它是一个简单的搜索和替换操作,你可以选择手动完成。
第二种方法是创建ln -s
到该文件,就像你对另一个文件所做的那样,因此存在两个文件之间的符号链接。
ln -s /far/off/script.sh ~/bin/script.sh
和
ln -s /far/off/file.sh ~/bin/file.sh
我宁愿在~/bin/中创建一个脚本文件,从适当的目录调用您的可执行文件。
这里是使用/sbin/ifconfig的示例:
$ cat > ~/bin/file
#!/bin/bash
file=/sbin/ifconfig
cd `dirname $file`
`basename $file`
(ctr+d)
$ chmod +x ~/bin/file
$ file
在这里,您应该看到ifconfig
的输出,但重点是:它是从/sbin
目录执行的。因此,如果ifconfig有依赖关系,它将正常工作。只需用绝对路径替换/sbin/ifconfig
。
或者,你可以修改你的脚本如下
pushd ~/bin
##### your script here
popd
readlink
和 dirname
的组合可以获取脚本的实际目录:
my_dir=$(dirname "$(readlink -f "$0")")
source "$my_dir/other_file"