标签: shebang

如何使Makefile可执行?

我有一个 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)

make shebang

5
推荐指数
1
解决办法
1274
查看次数

命令与shebang的距离?

shebang (#!/bin/sh) 放在 bash 脚本的第一行,通常在第二行后面跟着一个注释,描述脚本执行的操作。如果没有特别的原因,您决定将第一个命令放在 shebang 和注释的下方,例如 10000 行。这会减慢脚本的执行速度吗?

shell-script shebang

4
推荐指数
1
解决办法
265
查看次数

使用 find &amp; sed 查找具有给定 shebang 行的所有脚本

我想找出具有特定 shebang 行的所有脚本。具体来说,我想要符合以下条件的所有文件:

  • 它主要是一个纯文本文件(创建的东西看起来gzexe不太友好)
  • 第一行仅包含#!/bin/sh#! /bin/sh(带有空格)

我想用find,sedgrepfile可用)来完成此操作。
文件名是没有用的,因为有些脚本没有扩展名,甚至扩展名错误。另外,something.sh可能有一个 shebang 线,#!/bin/bash这也不是我想要的。

另外,有时我会遇到这样的文件:

#!/bin/sh
等等等等等等...

第一行是空的,shebang 位于第二行,这不是我想要的
我可以找到 shebang 行,find|grep但我不知道如何专门查找文件第一行的行。
感谢您提前提供的任何帮助。

grep sed find text shebang

4
推荐指数
1
解决办法
2093
查看次数

在脚本shebang中使用“-l”的优点和缺点是什么

我最近想出了一个简单的解决crontab 日志问题的方法,我想知道使用这个特定修复程序的优点和缺点是什么(运行带有“登录外壳标志”的脚本),如下所示:

#!/bin/bash -l 
Run Code Online (Sandbox Code Playgroud)

bash login cron shell-script shebang

4
推荐指数
1
解决办法
2180
查看次数

谁为只执行的文件运行解释器?

如果当前用户对文件只有执行 (--x) 权限,解释器(由#!/path/to/interpreter文件开头指定)在哪个用户下运行?

它不可能是当前用户,因为他没有读取文件的权限。它不能是 root,因为这样解释器中包含的任意代码将获得 root 访问权限。

那么,解释器进程作为哪个用户运行?

编辑:我认为我的问题假设该文件已经被读取到足以知道它指定了哪个解释器,而实际上它不会走那么远。解释执行目标文件的命令的当前 shell(通常是 b/a/sh)会尝试读取它,但会失败。

process permissions shebang interpreter

4
推荐指数
1
解决办法
383
查看次数

舍邦或不舍邦

我想在 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 中脱离的次数),我想知道这里是否有人可能有更好的解决方案。

linux shell scripting environment-variables shebang

4
推荐指数
3
解决办法
4211
查看次数

为什么我们不使用 #!command 作为 shebang 行?

#!python3
print("Hello")
Run Code Online (Sandbox Code Playgroud)

我发现这段代码在我的终端中运行良好。但每个人都这样做#!/path/to/file#!/usr/bin/env command

有什么理由避免#!command在 shebang 行中使用?

shell bash shebang

4
推荐指数
1
解决办法
937
查看次数

/usr/bin/env: zsh -: 没有那个文件或目录

我收到错误

/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 行是为了遵守两个完全独立的准则:

  1. 要使脚本可移植,请使用#!/usr/bin/env <cmd ...>而不是#!/path/to/cmd <...>.

  2. -作为唯一参数zsh在zsh的脚本横座板某类的家当线的攻击

所以,我可以更准确地重申我的问题如下:是否有可能同时满足这两个准则而不会在 ubuntu 下触发上面显示的错误?

scripting zsh env shebang

3
推荐指数
2
解决办法
2万
查看次数

shebang 行中的 `sudo -u user`

我希望能够以另一个用户的身份运行脚本,并且只能以该用户的身份运行。

我目前进行此设置的方式是拥有

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)

sudo shebang

3
推荐指数
1
解决办法
2471
查看次数

xslt shbang:从命令行使用 xslt

我已经(愚蠢地?)写了几个中等通用的xslt 脚本。

我很想将这些转换为从标准输入或类似内容读取 xml 文档的可执行文件。

使用其他语言执行此操作的方法是使用shbang

有没有一种简单/标准的方法可以用 xsltproc 和朋友来做到这一点?当然,我可以在 xsltproc 周围编写一个包装器,从第一条注释行开始……但如果有一些接近标准的东西,这会更好用。

scripting xml executable shebang interpreter

3
推荐指数
1
解决办法
960
查看次数