1

Redhat Linux Enterprise

Редактирование профиля терминала - Запустите пользовательскую команду вместо моей оболочки. Пользовательская команда:

tail -3000f /home/user1/folder/$PROJECT/folder2/folder3/text.log

Когда я сохраняю и перезапускаю, я получаю:

tail: cannot open `/home/user1/folder/$PROJECT/folder2/folder3/text.log' for reading

Когда я копирую этот путь непосредственно в другой терминал, хвостик работает нормально. Пользовательская команда автоматически экранирует переменную $ PROJECT?

3 ответа3

2

Я предполагаю, что вы используете gnome-терминал, и что "пользовательская команда", которую вы упоминаете, является пользовательской командой, которую будет запускать gnome-терминал вместо оболочки по умолчанию (обычно bash).

Gnome-терминал - это эмулятор терминала. Он не знает понятия переменных или расширения переменных. Вот почему, если ему приказывают выполнить некоторую строку, содержащую $PROJECT , он сделает это, но не развернет $PROJECT . Переменное расширение - это работа оболочки.

Прочитайте статьи в Википедии о терминале и оболочке, чтобы лучше понять разницу между терминалом и оболочкой.

Если я правильно понял, что вы запускаете gnome-терминал с пользовательской командой, тогда вам следует использовать эту пользовательскую команду:

bash -c "tail -3000f /home/user1/folder/$PROJECT/folder2/folder3/text.log"

Это скажет gnome-терминал выполнять bash с некоторыми аргументами. Аргументы скажут bash выполнить команду tail с некоторыми аргументами. Только на этот раз, перед выполнением tail , bash раскроет переменную $PROJECT перед выполнением.

Обратите внимание, что запуск bash с использованием параметра -c приведет к тому, что bash не будет читать файлы инициализации (.bashrc и / или .profile). Если $PROJECT определен в одном из этих файлов, то приведенная выше команда может завершиться ошибкой, поскольку $PROJECT будет расширяться до нуля.

Вы можете заставить bash прочитать файлы инициализации с помощью параметра -l :

bash -l -c "tail -3000f /home/user1/folder/$PROJECT/folder2/folder3/text.log"

Обратите внимание, что в bash есть такая концепция, как "оболочка входа в систему" и "интерактивная оболочка", что влияет на то, какие файлы инициализации читаются. Для более подробного объяснения разницы прочитайте следующий вопрос и ответы: Разница между .bashrc и .bash_profile.

0

Вы помещаете эту команду в файл и создаете файл или делаете его исполняемым и выполняете его как скрипт? Возможно, среда не передается в сценарий. Является ли $ PROJECT переменной среды (export'ed или setenv'ed), или это переменная в вашей текущей оболочке?

Если вы используете bash или sh, вы можете попробовать export $PROJECT или, если вы используете csh/tcsh, вы можете попробовать setenv PROJECT=(the value of $PROJECT)

0

Просто дикая догадка - попробуй:

tail -3000f /home/user1/folder/${PROJECT}/folder2/folder3/text.log

Он использует переменную, написанную как $ {PROJECT} вместо $ PROJECT. К сожалению, я не могу это проверить.

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