当我希望我的测试脚本具有干净的输出时,bash --norc失败了


0

我想我的测试脚本可以在没有初始启动脚本的情况下运行。

我发现选项“--norc”无法正常工作。 bash版本是4.2.0(2)

我的〜/ .bashrc包含

echo "in .bashrc"

我想bash --norc -x test.sh输出一个没有.bashrc的内容。

$ touch test.sh
$ bash -x test.sh
+ echo 'in .bashrc'
in .bashrc

$ bash --norc -x test.sh
+ echo 'in .bashrc'
in .bashrc

我发现这个问题只发生在我的嵌入式系统上。真正的Linux没有这样的问题。


1
“echo $ BASH_ENV”会产生任何输出吗?即使对于非交互式shell,该参数的值也将用作源文件的名称;也许它被设置为某个地方的“.bashrc”。
chepner

Answers:


1

正如我在评论中提到的,非交互式shell不应该阅读 .bashrc 一点都不所以你的问题不应该是“为什么 --norc 不工作?“;你的问题应该是“为什么会这样 shell脚本 (非交互式shell)阅读 .bashrc 首先?”。一种可能性是你有一个 BASH_ENV 设置为的环境变量 ~/.bashrc。如果那不是它,我不知道,但这里有一些你可能想尝试的事情:

  • 如果你的脚本没有做任何事情 bash 特定的,尝试运行它 sh;即, sh -x test.sh
  • 创建一个 testrc 用一个文件 echo 在里面,说 bash -–rcfile testrc -x test.sh
  • bash -–rcfile /dev/null -x test.sh
  • 任何和所有上述没有 -x。 (这不应该有所作为,但这个问题已经没有任何意义了。)
  • 将脚本作为普通程序运行: chmod +x test.sh 然后就是 test.sh (要么 ./test.sh,如果你没有 . 在你的搜索路径中)。 (你需要拥有 #!/bin/bash#!/bin/sh#!/usr/bin/env bash,或等同于第一行的东西 test.sh,但这无论如何都是一种很好的做法 - 请参阅 grawity的讨论 。) (但这不应该有所作为。)
  • 实际上,你应该首先这样做,但我不想惹恼你,让你忽略我的其余答案:Make 当然 问题是你说的是什么。检查,仔细检查和三重检查 test.sh 任何 source 要么 . 可能(可能间接)拉入的命令 .bashrc。同样,看看它是否调用可能正在执行此操作的任何其他脚本。验证 in .bashrc 消息真的来自 .bashrc - 尝试重命名 .bashrc (例如,到 .bashrc.hold或者其他)和/或 chmod 将它变为0,然后再试一次。

我简化了我的问题,所以我只是使用touch来创建空shell脚本。在询问之前我已经测试了你的所有建议。这很奇怪。我正在嵌入式系统中测试它。但是当我在Linux机器上测试时,它看起来很有用。
Daniel YC Lin

主要原因是'BASH_ENV',我解开它,然后它起作用。
Daniel YC Lin

1

--norc 仅适用于交互式贝壳;你正在通过提供来启动非交互式shell test.sh 论点。尝试添加 -i 标志以及强制交互式shell。 (注意:这可能会让你在新shell之后 test.sh 完成;我没有测试过。)


这没有多大意义。原因 --norc 仅应用于交互式shell是非交互式shell不应该读取 .bashrc 一点都不当然,我有兴趣听听是否指定 -i 修复问题,但这似乎是一种特殊的尝试方式。
Scott

好点子;我错过了森林的树木。我想真正的问题是,为什么即使没有--norc他也会看到.bashrc的输出。
chepner
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.