我有一个需要获取源代码的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命令。
这意味着:
如果我使用:
... && set this_file=($_) && bash -c "$this_file; bash" && ...
bash会抱怨括号错了(第二次发生这种情况,因为bash已经启动并尝试获取this_file
如果我使用:
... && bash -c ""$_"; bash" && ...
bash会收到一个无效的命令:bash -c "source" "this_file" "; bash"
如果我使用:
... && 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模块包解决了这个问题,但我会试一试)
答案 0 :(得分:1)
可以将参数传递给bash -c 'cmd'
构造,i。即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