我有一个 Makefile,我想make在双击它时自动运行(从 Ubuntu 文件管理器)。因此,我使这个 Makefile 可执行,并在其顶部添加了以下 shebang 行:
#!/usr/bin/make -f
Run Code Online (Sandbox Code Playgroud)
当我跑步时/usr/bin/make -f Makefile,我得到了想要的结果。
但是,当我双击 Makefile 或只是运行 时./Makefile,出现错误:
: No such file or directory
clang-9 -o .o
clang: error: no input files
make: *** [<builtin>: .o] Error 1
Run Code Online (Sandbox Code Playgroud)
使我的 Makefile 可执行的正确方法是什么?
以下是我的 makefile 的全部内容:
#!/usr/bin/make -f
# A makefile for building pdf files from the text (odt files) and slides (odp files).
# Author: Erel Segal-Halevi
# Since: 2019-02
SOURCES_ODP=$(shell find . -name '*.odp')
TARGETS_ODP=$(subst …Run Code Online (Sandbox Code Playgroud) shebang (#!/bin/sh) 放在 bash 脚本的第一行,通常在第二行后面跟着一个注释,描述脚本执行的操作。如果没有特别的原因,您决定将第一个命令放在 shebang 和注释的下方,例如 10000 行。这会减慢脚本的执行速度吗?
我想找出具有特定 shebang 行的所有脚本。具体来说,我想要符合以下条件的所有文件:
gzexe不太友好) #!/bin/sh或#! /bin/sh(带有空格) 我想用find,sed和grep(file可用)来完成此操作。
文件名是没有用的,因为有些脚本没有扩展名,甚至扩展名错误。另外,something.sh可能有一个 shebang 线,#!/bin/bash这也不是我想要的。
另外,有时我会遇到这样的文件:
#!/bin/sh 等等等等等等...
第一行是空的,shebang 位于第二行,这不是我想要的。
我可以找到 shebang 行,find|grep但我不知道如何专门查找文件第一行的行。
感谢您提前提供的任何帮助。
我最近想出了一个简单的解决crontab 日志问题的方法,我想知道使用这个特定修复程序的优点和缺点是什么(运行带有“登录外壳标志”的脚本),如下所示:
#!/bin/bash -l
Run Code Online (Sandbox Code Playgroud) 如果当前用户对文件只有执行 (--x) 权限,解释器(由#!/path/to/interpreter文件开头指定)在哪个用户下运行?
它不可能是当前用户,因为他没有读取文件的权限。它不能是 root,因为这样解释器中包含的任意代码将获得 root 访问权限。
那么,解释器进程作为哪个用户运行?
编辑:我认为我的问题假设该文件已经被读取到足以知道它指定了哪个解释器,而实际上它不会走那么远。解释执行目标文件的命令的当前 shell(通常是 b/a/sh)会尝试读取它,但会失败。
我想在 shebang 中使用一个程序,所以我创建了一个名为 <myscript> 的脚本:
#!<mypgm>
Run Code Online (Sandbox Code Playgroud)
我还希望能够直接从命令提示符运行 <mypgm>。
<mypgm> args...
Run Code Online (Sandbox Code Playgroud)
到目前为止,没有问题。
我希望能够从带有参数的命令提示符运行 <myscript>。
<myscript> blabla
Run Code Online (Sandbox Code Playgroud)
反过来,shebang 使用以下参数调用 <mypgm>:
<mypgm> <myscript> blabla
Run Code Online (Sandbox Code Playgroud)
现在,我需要知道何时使用 shebang 调用 <mypgm> <myscript> blabla,或者不:
myscript blabla # uses the shebang
-or-
<mypgm> myscript blabla # directly in the command prompt.
Run Code Online (Sandbox Code Playgroud)
我查看了环境变量(编辑:<=== 错误断言(¬,¬”) ),在进程表(父进程也是),但没有找到任何改变的方法。
到目前为止,我发现的唯一一件事是:
grep nonvoluntary_ctxt_switches /proc/$$/status
Run Code Online (Sandbox Code Playgroud)
当这条线刚好在 shebang 之后,通过 shebang 调用时该值通常为 2(有时为 3),在直接调用时为 1(有时为 2)。由于不稳定并依赖于进程调度(进程从其 CPU 中脱离的次数),我想知道这里是否有人可能有更好的解决方案。
#!python3
print("Hello")
Run Code Online (Sandbox Code Playgroud)
我发现这段代码在我的终端中运行良好。但每个人都这样做#!/path/to/file或#!/usr/bin/env command。
有什么理由避免#!command在 shebang 行中使用?
我收到错误
/usr/bin/env: zsh -: No such file or directory
Run Code Online (Sandbox Code Playgroud)
...当我运行以zsh以下shebang行开头的可执行脚本时:
#!/usr/bin/env zsh -
Run Code Online (Sandbox Code Playgroud)
此外,FWIW,替换-为--原因/usr/bin/env打印关于zsh --.
我只在 ubuntu 下看到过这个错误,而且只在 shebang hack 的上下文中看到过。在达尔文下,相同的脚本运行良好。在 ubuntu 下,运行
% /usr/bin/env zsh -
Run Code Online (Sandbox Code Playgroud)
从命令行成功。(实际上,“在 ubuntu 下”应该理解为“在 ubuntu 12.04 LTS 和env (GNU coreutils) 8.13”下的简写。)
我的问题是:如何修改上面的shebang以避免此错误?
当然,我知道删除尾随-会消除错误,但这不是一个可以接受的解决方案。这篇文章的其余部分解释了原因。
导致错误的 shebang 行是为了遵守两个完全独立的准则:
要使脚本可移植,请使用#!/usr/bin/env <cmd ...>而不是#!/path/to/cmd <...>.
把-作为唯一参数zsh在zsh的脚本横座板某类的家当线的攻击。
所以,我可以更准确地重申我的问题如下:是否有可能同时满足这两个准则而不会在 ubuntu 下触发上面显示的错误?
我希望能够以另一个用户的身份运行脚本,并且只能以该用户的身份运行。
我目前进行此设置的方式是拥有
alice ALL = (bob) NOPASSWD: /home/alice/script.sh
Run Code Online (Sandbox Code Playgroud)
在 sudoers 文件和
alice@foo:~$ ls script.sh
-rwxr-xr-x 1 root root ..... script.sh
alice@foo:~$ lsattr script.sh
----i----------- script.sh
alice@foo:~$ head -1 script.sh
#!/bin/bash
alice@foo:~$ sudo -u bob ./script.sh
ok
Run Code Online (Sandbox Code Playgroud)
有没有办法让shebang线像
#!/usr/bin/sudo -u bob -- /bin/bash
Run Code Online (Sandbox Code Playgroud)
这样爱丽丝就可以跑了
alice@foo:~$ ./script.sh
ok
Run Code Online (Sandbox Code Playgroud)
?
如果我尝试这个,我只会收到错误消息
sudo: unknown user: blog -- /bin/bash
sudo: unable to initialize policy plugin
Run Code Online (Sandbox Code Playgroud)