【问题标题】:Start shell in non-interactive mode with rcfile使用 rcfile 以非交互模式启动 shell
【发布时间】:2015-04-10 21:37:39
【问题描述】:

背景

我正在构建一个加速开发的小东西,基本上我已经厌倦了记住现代框架强加给我的 foreman run python app.py db migratebundle exec rake db:migrate 等。

我是https://github.com/michaeldfallen/butler

我正在考虑在您的默认 shell 中运行命令,因为每个人都有自己的偏好,因此您可以访问通常在您的路径上的所有内容。

我的尝试在这里butler/pull/3

问题

问题是在非交互模式下运行 shell 会导致它无法运行您的 rcfile(~/.bashrc~/.zshrc 等)。

因此,如果您希望能够使用的某些命令是在您的 rcfile 中定义的别名,或者如果它们被添加到您的 rcfile 的 PATH 中,则它们可能不存在。

(实际上并没有测试 PATH 路径,可能是因为您启动 bash 后,您实际上将 shell 作为当前脚本的子 shell 运行,因此仍然可以访问路径,这只是一个假设)

问题

有没有什么办法可以在命令模式下启动一个shell并让它运行rcfile?

如果没有,是否有任何方法在设置 args 时运行命令(可能在从当前进程生成的子 shell 中)以使 $1、$2、$@ 仍然在命令中工作?

我试过了:

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

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

【问题讨论】:

    标签: bash shell sh


    【解决方案1】:

    有没有什么办法可以在命令模式下启动一个shell并让它运行rcfile?

    当然有。您的 rcfiles 只是 shell 脚本,就像其他所有东西一样。

    source ~/.bashrc
    

    source ~/.zshrc
    

    你可以走了。

    【讨论】:

    • 这不是一个非常可靠的方法。我必须特别考虑每个不同的外壳,每个人的自定义配置很可能会破坏它。并且由于启动交互式 shell 可以做到这一点,并且对所有用户都有效(否则他们根本无法使用他们的 shell),因此找到一种触发该行为的方法似乎更具未来性。
    • @MichaelAllen 您从来没有提到您需要为多个您不了解其外壳的人执行此操作。我刚刚回答了你提出的问题。
    • @MichaelAllen 另外,“每个人的自定义配置很可能会破坏它”——根本不是真的。当您启动交互式 shell 时,它会像您明确使用 source 一样获取您的 rcs(当然,它们的序列,在手册/手册页中定义)。因此,这与启动交互式 shell 没有什么不同(如果您获取正确的文件)。
    【解决方案2】:

    问题是在非交互模式下运行 shell 会导致 不运行您的 rcfile(~/.bashrc、~/.zshrc 等)。

    在您的~/.bash_profile 中,添加以下行:

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

    (如果用户没有~/.bash_profile,则将其添加到他的~/.bash_login,或~/.profile。)

    对其他 shell 执行类似操作。

    【讨论】:

    • 在我的回答下方查看他的评论。显然他不喜欢source/.
    • @4ae1e1,据我了解,他不希望用户以交互方式调用source,因为这取决于用户知道他在做什么。我在这里建议它根据特定 shell 的启动文件自动完成。希望OP会澄清。
    • 嗯,我认为他正在编写一个脚本,我是说他可以在该脚本中执行source。 “希望OP会澄清。”是的,我真的不知道他想做什么。
    猜你喜欢
    • 1970-01-01
    • 2022-07-14
    • 2013-04-16
    • 2013-02-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-17
    • 2016-02-17
    相关资源
    最近更新 更多