使用rcfile以非交互模式启动shell

guz6ccqo  于 2023-03-13  发布在  Shell
关注(0)|答案(3)|浏览(145)

背景

我正在构建一个小东西来加速开发,基本上我已经厌倦了记住foreman run python app.py db migratebundle exec rake db:migrate等现代框架强加给我的东西。
https://github.com/michaeldfallen/butler
我正在考虑在默认shell中运行命令,因为每个人都有自己的首选项,这样您就可以访问通常在您路径上的所有内容。
我的尝试是在这里巴特勒/拉/3。

问题

问题是在非交互模式下运行shell会导致它不运行您的rcfile(~/.bashrc~/.zshrc等)。
因此,如果某些命令是在rcfile中定义的别名,或者它们被添加到rcfile的PATH中,那么您希望能够使用的命令可能不存在。
(我还没有实际测试PATH,可能是因为你启动了bash,你实际上把shell作为当前脚本的子shell运行,所以仍然可以访问路径,这只是一个假设)

问题

有没有办法在命令模式下启动shell并让它运行rcfile?
如果没有,有没有办法在设置参数的同时运行命令(可能在当前进程派生的子shell中),以便$1、$2、$@在命令中仍然有效?
我试过:

execute() {
  local command="$1";shift;
  local args=$@
  set -- $args
  $command
}

其中用法是execute "echo \"Hello, $1 $2!\"" "Michael" "Allen",但输出是"Hello, $1 $2!",因此很明显它没有进行arg替换。

bxpogfeg

bxpogfeg1#

有没有办法在命令模式下启动shell并让它运行rcfile?
当然有,你的rc文件和其他东西一样只是shell脚本。

source ~/.bashrc

source ~/.zshrc

你就可以走了。

o2g1uqev

o2g1uqev2#

问题是在非交互模式下运行shell会导致它不运行您的rcfile(~/.bashrc、~/.zshrc等)。
~/.bash_profile中,添加以下行:

[ -f ~/.bashrc ] && . ~/.bashrc

(If用户没有~/.bash_profile,则将其添加到他的~/.bash_login~/.profile。)
对其他壳执行类似操作。

b0zn9rqh

b0zn9rqh3#

如果您不介意保留输出,那么在大多数shell中(我检查了bash、csh、zsh、ksh、tcsh)-i表示交互式。

<shell> -i <somescript>

如果你想把它放在后台,把它放在一个分离的屏幕会话(或tmux)中,如果你不想调用它,但仍然保持关注它,可以选择把它记录到一个文件中。

screen -dmS <friendly_name> -Logfile <some.log> <shell> -i <somescript>

相关问题