bash trickery使用--init-file

时间:2010-07-29 09:38:47

标签: bash

我有一个bash-script(让我们称之为/usr/bin/bosh)使用以下she-bang行:

#!/bin/bash --init-file

它定义了几个函数,并且通常将交互式shell放在用户可以控制一堆我想要的东西的环境中。这非常有效。现在,对于有趣的部分,我希望能够让用户在层之间使用这个来编写新脚本,而无需明确地使用这个脚本。那可能吗?

我尝试使用she-bang线写一个脚本(让我们称之为/usr/bin/foo

#!/usr/bin/bosh

我认为,将重写以执行命令

/usr/bin/bosh /usr/bin/foo

反过来会导致

/bin/bash --init-file /usr/bin/bosh /usr/bin/foo

但它不起作用,/usr/bin/foo被执行,但/usr/bin/bosh在此之前不是源。

即使脚本不是交互式的,我怎样才能使它源自init文件?或者我是否必须为此编写包装脚本?我想过有这样的剧本

#!/bin/bash
. /usr/bin/bosh
. "$1"

但如果我没有指定要运行的脚本,那么这不会变成交互式shell,这将是一种耻辱。

修改
为了澄清,我真正要问的是,无论是否是交互式(在启动交互式部分之前)(在执行脚本之前),我如何使bash源成为一个文件(如--init-file)?如果没有办法,或许还有其他方法可以解决我的问题吗?

2 个答案:

答案 0 :(得分:4)

#指定的程序!不能是另一个脚本我至少要害怕linux内核2.6.27.9,它允许这个功能。如果你在foo上运行strace,你会看到你得到一个ENOEXEC或exec格式错误,因为bosh不能作为一个独立的程序执行。

正在发生的是,而不是/ bin / bosh被执行并将foo作为输入,你的登录shell只是默默地回到在子shell中执行foo本身,这就是为什么它似乎几乎可以工作。 / p>

以您想要的方式启动bash的包装器或C程序可能是您唯一的选择。即使升级到你的内核,它也不会像你想要的那样工作。

你想知道关于#的一切!在这里:http://www.in-ulm.de/~mascheck/various/shebang/

编辑:如果您的内核确实支持链式脚本,那么/usr/bin/bosh的解决方法可能类似于:

#!/bin/bash
if [ ! $PS1 ]; then
   exec /bin/bash --init-file "$0" -i "$@"
fi
... rest of bosh init file ...

一个exec似乎不可避免地以你想要的方式工作。

答案 1 :(得分:0)

脚本不是运行时环境。这可能是你的问题。 shebang玷污运行时环境。 ie ... / bin / java / bin / python / bin / bash / bin / dash。您的脚本不是环境。你的“包装器示例”是合适的。