Я хочу, чтобы мой тестовый скрипт мог выполняться без начальных скриптов запуска.

Я нашел опцию "--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 такой проблемы нет.

2 ответа2

1

--norc применяется только к интерактивным оболочкам; вы запускаете неинтерактивную оболочку, предоставляя аргумент test.sh Попробуйте также добавить флаг -i чтобы вызвать интерактивную оболочку. (Примечание: это может оставить вас в новой оболочке после завершения test.sh ; я не тестировал.)

1

Как я упоминал в своем комментарии, неинтерактивные оболочки вообще не должны читать .bashrc .  Таким образом, ваш вопрос не должен звучать так:«Почему --norc не работает?»; Ваш вопрос должен звучать так:«Почему этот сценарий оболочки (неинтерактивная оболочка) в первую очередь читает .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 .)  (Но это тоже не должно иметь значения.)
  • И действительно, сначала вы должны сделать это, но я не хотел вас раздражать и заставлять игнорировать остальную часть моего ответа: убедитесь, что проблема в том, что вы говорите.  Проверьте, перепроверьте и трижды проверьте test.sh для любого source или . Команды, которые могут (возможно косвенно) извлекать .bashrc .  Точно так же посмотрите, вызывает ли он какие-либо другие сценарии, которые могут это делать.  Убедитесь, что сообщение in .bashrc действительно исходит от .bashrc - попробуйте переименовать .bashrc (например, в .bashrc.hold или что-то еще) и / или chmod его на 0, и попробуйте снова.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .