1

我有一个需要获取资源的 bash 文件。用户可能在不知道(默认配置)的情况下拥有 csh,所以我想将 shell 更改为 bash,但获取文件是因为这是用户的意图。

对此有很多帮助,生成的代码将是:

#!/bin/csh (AND bash!)
[ "$?shell" = "1" ] && bash --login -c 'source this_file; bash' && exit
...

this_file除了必须对源文件进行硬编码这一事实之外,一切都按预期工作。在 csh$_中将包含source this_file因为那是开始获取脚本的命令,但是我无法将它传递给 bash 命令。

这表示:

  1. 如果我使用:

    ... && set this_file=($_) && bash -c "$this_file; bash" && ...

    bash 会抱怨括号错误(这在 bash 启动并尝试获取源时第二次发生this_file

  2. 如果我使用:

    ... && bash -c ""$_"; bash" && ... 

    bash 得到一个无效的命令:bash -c "source" "this_file" "; bash"

  3. 如果我使用:

    ... && bash --login -c "$_; bash" && ... 

    csh 得到一个损坏的命令:“不匹配”。

我不知道如何使用$_可接受的 bash 语法,将值作为单个命令传递(即bash -c "source this_file; bash"

这是测试:

cat >a.sh<<'EOF'
[ "$?shell" = "1" ] && bash --login -c 'source a.sh; bash' && exit
a=1
EOF

然后我希望这会起作用:

$ csh -c 'source a.csh'
$ echo $a
1

我很确定它曾经可以工作...我正在尝试找出为什么现在不行。(我使用 tcl modules 包解决了这个问题,但我会试一试)

4

1 回答 1

1

可以将参数传递给bash -c 'cmd'构造,即bash -c 'echo $@' arg0 1 2 3 4 5

#!/bin/csh (AND bash!)
#[ "$?shell" = "1" ] && bash --login -c 'source this_file; bash' && exit
[ "$?shell" = "1" ] && bash --login -c '${@}; bash' arg0 $_ && exit
于 2013-03-18T17:33:49.040 回答