tcl: Как определить оболочку для команды модуля - PullRequest
2 голосов
/ 08 ноября 2011

Я программирую на tcl (для использования с командой modules).Мне нужно выяснить, какая оболочка используется пользователем.Поскольку я никогда раньше не программировал на tcl, я не знаю, что не так с моим простым кодом.Может кто-нибудь, пожалуйста, посоветовать?

set shell [module-info shell]
if { $shell=="bash" } {
    puts "running bash"
}

Я получаю ошибку (извините, я не включил ее изначально):

intel64(32):ERROR:102: Tcl command execution failed: if { $shell == "bash" } {
    puts "running bash
}

Обратите внимание, что intel64 - это файл, в котором этот коднайдена и строка 34 является последней строкой.

Ответы [ 4 ]

3 голосов
/ 08 ноября 2011

Одинарные кавычки не имеют особого значения для Tcl.В Tcl двойные кавычки аналогичны двойным кавычкам оболочки, а фигурные скобки ({}) аналогичны одинарным кавычкам оболочки.Вы хотели бы написать

if { $shell == "bash" } ...

Полный синтаксис Tcl, задокументированный здесь: http://www.tcl.tk/man/tcl8.5/TclCmd/Tcl.htm

Это не объясняет сообщение об ошибкеСам Tcl не имеет команды system.Я не могу сказать, как эта «команда модулей» расширяет Tcl.Попробуйте

puts "running bash"

или, если вы действительно хотите использовать echo, тогда

exec echo running bash
1 голос
/ 17 апреля 2013

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

modules - это просто программа tcl, которая каким-то образом изменяет вашу среду оболочки внезависимый от оболочки способ.Это делается с помощью простого трюка, проверьте вашу среду:

set | grep -A 10 module
...
module () 
{ 
    eval `/modules-3.2.9/Modules/$MODULE_VERSION/bin/modulecmd bash $*`
}

Таким образом, трюк создает правильную строку, которая затем оценивается текущей оболочкой.Эта строка взята из stdout, поэтому, что должно было произойти после того, как она сработала , это то, что ваша оболочка должна иметь жалобу на попытку оценить "запущенный bash"

Я озадачен, почему онасработало после того, как вы добавили пропущенную цитату.

1 голос
/ 08 ноября 2011

2 комментария:

  1. используйте , чтобы отобразить значение $ shell , введите , чтобы вы могли точно увидеть, что происходит.
  2. ваш еще должен быть включен та же строка, что и у правой фигурной скобки перед ней.
  3. Вы говорите, что значением $ shell является 'bash'. Если это так, то вам нужно изменить свой оператор if и заключить его в двойные кавычки, например, " 'баш'" .
0 голосов
/ 02 июля 2014
set shell $::env(SHELL)
switch -glob $shell {
  "/bin/tcsh" -
  "/bin/csh" {
  setenv foamDotFile $env(FOAM_INST_DIR)/OpenFOAM-2.3.0/etc/cshrc
  }
  "/bin/ksh" -
  "/bin/bash" {
  setenv foamDotFile $env(FOAM_INST_DIR)/OpenFOAM-2.3.0/etc/bashrc
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...