1
bjzhou1990 2016-08-30 17:51:18 +08:00 1
$0
|
2
lxy42 2016-08-30 17:51:24 +08:00 1
echo $(basename $0)
|
3
Devin OP |
7
hasdream 2016-08-30 19:01:18 +08:00 1
|
8
wsy2220 2016-08-30 19:01:34 +08:00 via Android 1
如果是符号链接,$0 也不准
|
9
fiht 2016-08-30 21:02:59 +08:00 1
依楼上各位所言,确实没有一种很好的方法来确定脚本自身文件名。
其实原理很简单。 因为维度不一样, shell 脚本运行的时候是无法直接获得比自己高一维度的信息的。 就像虚拟机里面运行的程序不知道自己是在虚拟机里面跑一个道理 |
10
lrz0lrz 2016-08-30 21:40:21 +08:00 6
|
12
SoloCompany 2016-08-31 00:07:02 +08:00 1
|
13
Vicer 2016-08-31 01:25:29 +08:00 via Android
echo $0| awk -F "/" { print $NF }
没试过,不知有效不 |
14
Vicer 2016-08-31 01:28:02 +08:00 via Android 1
echo $0| awk -F "/" '{ print $NF }'
忘打引号了 |
15
jyf007 2016-08-31 06:44:37 +08:00 via Android
冒个泡,有道理啊。我调试 shell 实在麻烦。
|
16
clearbug 2016-08-31 07:05:47 +08:00 via Android
涨姿势。不过楼主获取自身文件名做什么?
|
17
GPU 2016-08-31 08:54:02 +08:00 1
realpath path/to/filename
这个也很有用 ,我也曾经找了很久. |
18
wweir 2016-08-31 09:31:48 +08:00 2
|
19
araraloren 2016-08-31 11:12:35 +08:00 1
做了个测试
getname.sh: #!/usr/bin/env bash echo `basename $0` echo `basename ${BASH_SOURCE}` getname --> getname.sh , getname 是一个软链接 ./getname | bash ./getname | sh ./getname getname getname ./getname.sh | bash ./getname.sh | ./getname.sh getname.sh getname.sh source ./getname bash getname source ./getname.sh bash getname.sh |
20
extreme 2016-08-31 15:21:51 +08:00 1
C 的 argv[0],哈哈哈……
main.c: #include <stdio.h> #include <stdlib.h> #include <unistd.h> int main(void) { char *argv[] = {"Hi, argv[0]", "argv[1]", NULL}, *env[] = {NULL}; if (execve("./print_argv_0", argv, env) < 0) { perror("execve()"); return -1; } return 0; } print_argv_0.c: #define _BSD_SOURCE #include <stdio.h> #include <unistd.h> #include <stdlib.h> int main(int argc, char *argv[]) { int pid = getpid(); char buffer[100], result_buffer[100]; printf("%s\n", argv[0]); sprintf(buffer, "/proc/%d/exe", pid); printf("%s\n", realpath(buffer, result_buffer)); return 0; } Example output: user@hostname:/tmp$ /tmp/main Hi, argv[0] /tmp/print_argv_0 |
21
ayanmw 2021-03-04 20:35:52 +08:00
弱弱的 提一句: caller
bash 有一个命令 caller ,可以获得 调用堆栈的 line filename 所以 用 caller , 基本上 就 OK 了 ```shell getFileName(){ fname=$(echo $(caller)|cut -d ' ' -f 2-) if test -f $fname;then link=$(readlink $fname); if test -z "$link";then echo $(basename $fname);return 0;fi echo $(basename $(readlink $fname)); return 0 fi echo $fname } echo fileName=$(getFileName) ``` |
22
ayanmw 2021-03-04 20:59:14 +08:00
@ayanmw 又整理了一下:
```bash getFileName(){ call=$(caller) if test -z "$call";then echo $0 return 0 fi fname=$(echo $(caller)|cut -d ' ' -f 2-) if test -f $fname;then link=$(readlink $fname); if test -z "$link";then if test -f $fname;then echo $(basename $fname);return 0; fi echo $fname;return 0; fi echo $(basename $(readlink $fname)); return 0 fi echo $fname } echo fileName=$(getFileName) ``` 函数可以在任意文件, 你只需要 `. libFunc.sh` 或者 `source libFunc.sh` 包含这个函数, 在任何地方调用 `echo fileName=$(getFileName)` 都可以获得 你当前所在的文件. caller 这个 bash 内置方法, 终于解决了我多年的疑问了. |