有没有一种简单的方法可以打印完整的路径file.txt?
file.txt = /nfs/an/disks/jj/home/dir/file.txt
Run Code Online (Sandbox Code Playgroud)
该 <command>
dir> <command> file.txt
Run Code Online (Sandbox Code Playgroud)
应该打印
/nfs/an/disks/jj/home/dir/file.txt
Run Code Online (Sandbox Code Playgroud) 在Linux上,该readlink实用程序接受一个-f跟随其他链接的选项.这似乎不适用于Mac和可能基于BSD的系统.相当于什么?
这是一些调试信息:
$ which readlink; readlink -f
/usr/bin/readlink
readlink: illegal option -f
usage: readlink [-n] [file ...]
Run Code Online (Sandbox Code Playgroud) 通常包含脚本的方式是"源"
例如:
main.sh:
#!/bin/bash
source incl.sh
echo "The main script"
Run Code Online (Sandbox Code Playgroud)
incl.sh:
echo "The included script"
Run Code Online (Sandbox Code Playgroud)
执行"./main.sh"的输出是:
The included script
The main script
Run Code Online (Sandbox Code Playgroud)
...现在,如果您尝试从其他位置执行该shell脚本,除非它在您的路径中,否则无法找到包含.
确保脚本可以找到包含脚本的好方法是什么,特别是如果脚本需要可移植的话?
我用这个参数挂载了容器:
-v/home/test /:/ home/test
在主机内部/ home/test中有一个指向/ mnt /文件夹的符号链接.
但是这个链接,虽然可以看到指向的位置,但似乎在容器内部被破坏了:
root@f93f72b45013:/var/www/html# cd /home/test/
root@f93f72b45013:/home/test# ls -lrt
total 11956
lrwxrwxrwx. 1 root root 40 Jul 20 15:55 file -> /mnt/mountedfile/
root@f93f72b45013:/home/test# ls -lrt file/*
ls: cannot access file/*: No such file or directory
Run Code Online (Sandbox Code Playgroud)
这甚至可以在码头工作中完成吗?我不确定是否有办法做到这一点.
我知道我可以直接挂载符号链接指向的位置,但我只是想知道这是否可能.
如何获取任何给定路径bash并将其转换为规范形式,取消引用路径中可能包含的任何符号链接?
例如:
~$ mkdir /tmp/symtest
~$ cd /tmp/symtest/
/tmp/symtest$ mkdir -p foo/bar cat/dog
/tmp/symtest$ cd foo/bar/
/tmp/symtest/foo/bar$ ln -s ../../cat cat
/tmp/symtest/foo/bat$ cd ../../
/tmp/symtest$ tree
.
|-- cat
| `-- dog
`-- foo
`-- bar
`-- cat -> ../../cat
6 directories, 0 files
Run Code Online (Sandbox Code Playgroud)
我怎样才能获得完整的规范路径/tmp/symtest/foo/bar/cat(即:)/tmp/symtest/cat?
是否有可能在/ usr/local/bin文件夹中执行符号链接的文件,以获取原始脚本的绝对路径?好吧,..我知道原始文件在哪里,我知道它因为我正在链接它.但是,即使我移动原始源代码(和符号链接),我希望这个脚本正常工作.
#!/bin/bash
echo "my path is ..."
Run Code Online (Sandbox Code Playgroud) 当我需要在脚本本身内部获取脚本文件的路径时,我使用以下内容:
`dirname $0`
Run Code Online (Sandbox Code Playgroud)
这工作文件,直到我通过sym链接调用脚本.在这种情况下,上面的代码打印链接的位置而不是原始文件.
有没有办法获取原始脚本文件的路径,而不是链接?
谢谢,迈克
查找java二进制文件可能很痛苦:
which java 给 /usr/bin/javalh $(which java) 给 /usr/bin/java -> /etc/alternatives/javalh /etc/alternatives/java 给 /etc/alternatives/java -> /usr/lib/jvm/jdk1.8.0_66/bin/java有没有办法自动跟踪符号链并打印所有成员?例如whichfollow或follow /usr/bin/java可以给:
/usr/bin/java
-> /etc/alternatives/java
-> /usr/lib/jvm/jdk1.8.0_66/bin/java
Run Code Online (Sandbox Code Playgroud) 我的意思是我想使用unset它本身不是shell函数.如果我能做到这一点,我可以command通过跑步来确保它是纯粹的
#!/bin/sh
{ \unset -f unalias command [; \unalias unset command [ } 2>/dev/null;
# make zsh find *builtins* with `command` too:
[ -n "$ZSH_VERSION" ] && options[POSIX_BUILTINS]=on
Run Code Online (Sandbox Code Playgroud)
如果我使用的是Debian Almquist shell(破折号),我认为我可以依赖它\unset是纯粹的.至少我不能定义一个名为shell函数unset在dash.而在我bash或之中zsh我可以定义unset() { echo fake unset; },然后我无法取消该功能:\unset -f unset输出"假未设置".
与此相关,在bash脚本中,可以导出函数,export -f <function name>以便可以在bash脚本调用的脚本中使用它.但是,这在dash脚本中不起作用.我想知道,如果我不得不担心一个命令被定义为我写的脚本文件外的shell函数,如果我正在使用dash?其他POSIX兼容的shell怎么样?