如果先下载到本地文件再执行,可以通过 $0 拿到当前脚本的路径,之后可以进行复制等操作。
但通过例如 curl xxx.com | sh 这种方式执行,还能优雅拿到当前运行的脚本内容吗?重复 curl 一次不算,预先把整个脚本的内容当做字符串不算。
最好有类似 JS 里可以把函数 toString 的方法,外表仍然是可执行的代码,但可以运行时转成字符串数据。不知道 shell 或 bash 里能否实现~
如果先下载到本地文件再执行,可以通过 $0 拿到当前脚本的路径,之后可以进行复制等操作。
但通过例如 curl xxx.com | sh 这种方式执行,还能优雅拿到当前运行的脚本内容吗?重复 curl 一次不算,预先把整个脚本的内容当做字符串不算。
最好有类似 JS 里可以把函数 toString 的方法,外表仍然是可执行的代码,但可以运行时转成字符串数据。不知道 shell 或 bash 里能否实现~
|
cMay 29, 2019
1
`tee`
|
|
v2nikaMay 29, 2019
3
它本身就不是一个文件, 如果你要的是 $PWD + 你 curl 的 pathname 的最后一层, 那么通过 pipe 是不可能拿到的, 因为 pipe 只会管 stdout/stderr
|
|
jswhMay 29, 2019
4
可以用 exec 命令
#!/bin/bash cmd='echo exec' echo $cmd exec $cmd |
|
ipwxMay 29, 2019
6
哦我没读懂楼主的意思,抱歉。
|
|
9
没太明白?打印执行内容吗?
试试 set -x? |
|
ps1aniugeMay 29, 2019
10
问:如何在 powershell.exe 中,边执行,边观看脚本调用过程,并显示变量值?类似于 sh -x 那样?
答: 1 在 powershell.exe 中敲入命令:(放在脚本的第一行也行,第 n 行也行,放哪就从哪显示) set-psdebug -Trace 2 2 运行脚本。 |
|
RobberPhexMay 29, 2019
11
bashdb?
|
|
iwtbauhMay 29, 2019 via Android
12
看完评论又读了一遍题,答案是不能
至少 POSIX shell 没有给脚本提供这种接口,但你可以制作一个“修改版本”的 shell 解释器,提供一些命令扩展,让 shell 读尽全部输入,并把新输入和执行过的代码以字符串形式暴露给当前执行的代码。 |
|
msg7086May 29, 2019
13
反过来想想,管道是个流,所以 sh 在执行到你代码的时候,文件可能还没读完呢。也就是说,最多最多,在你的 shell 脚本里只能读到这行代码之前的内容,而没办法读到之后的。
至于能不能读,我觉得难。 |
|
PTLinMay 29, 2019
14
|
|
geelawMay 29, 2019 via iPhone
15
听起来是说楼主有一个脚本要通过网络分发并且用这种方式执行,又希望自己的脚本可以知道自己的代码。
这很简单,既然楼主自己可以控制代码,那么用递归定理改变脚本的写法即可,这样脚本可以自己算出自己的代码。 正经答案:不要尝试诡异的方法,让用户改变执行方式。 |
|
zwh2698May 30, 2019 via Android
17
用管道执行,就可以通过管道获取 ,linux 和 windows 都可以,只是 API 不同
|
|
zwh2698May 30, 2019 via Android
18
是不是我看错题了,如果错了,请忽略
|
|
zwh2698May 30, 2019 via Android
19
没懂你的问题
|
|
trn4May 30, 2019
20
curl 一个脚本,在脚本里下载你的脚本。直接执行怕是不行,curl+pipe 中间根本就没有文件,何来路径。
|
|
pkookp8May 30, 2019 via Android
21
自己做一个 shell
|
|
zerofinyMay 30, 2019
23
curl ww.a.com/a.sh | python -c 'import sys;stdin=sys.stdin.read();f=open("/tmp/a.sh", "w");f.write(stdin);f.flush();sys.stdout.write(stdin);sys.stdout.flush()' | sh
|
|
no1xsyzyJul 9, 2019
24
quine?
|