Bash 如何在IDL中使用pref_set命令
我想向IDL路径添加一个目录,并使用:Bash 如何在IDL中使用pref_set命令,bash,idl-programming-language,Bash,Idl Programming Language,我想向IDL路径添加一个目录,并使用: pref_set,'IDL_PATH','+/home/mydirectory/Tools/IDL/:<IDL_DEFAULT>',/COMMIT “myfile”是“mydirectory”中的一个,错误显示: % Error opening file. File: myfile 每次启动IDL时,我都需要执行pref\u set…,以使其正常工作。为什么呢? 我使用Ubuntu 14.04和bash。IDL 8.4 幸运的是,我的同事帮
pref_set,'IDL_PATH','+/home/mydirectory/Tools/IDL/:<IDL_DEFAULT>',/COMMIT
“myfile”是“mydirectory”中的一个,错误显示:
% Error opening file. File: myfile
每次启动IDL时,我都需要执行pref\u set…
,以使其正常工作。为什么呢?
我使用Ubuntu 14.04和bash。IDL 8.4
幸运的是,我的同事帮我找到了解决办法。在.bashrc中添加路径
export IDL_PATH= '+/mydirectory/IDL:<IDL_DEFAULT>'
export IDL_PATH='+/mydirectory/IDL:'
注意单引号和
+
在这里很重要。这是IDL的语法,而不是bash语法。希望它能帮助任何遇到同样问题的人 这应该适合你。检查!再次启动IDL后的path
系统变量:
IDL> print, !path
您的目录应该是第一个条目
此外,请检查首选项文件以查看它是否确实正在更改。使用PREF\u SET
后,退出IDL并检查文件:
cat ~/.idl/idl/pref-10-idl_8_4-unix
文件中应该有一个IDL路径的条目。它实际上取决于您使用的IDL版本。如果您使用的IDL版本介于6.2和7.0.3之间,则可以使用
PREF_SET
来控制路径。在6.2版本之前,您可以在Ubuntu中设置环境变量,并修改IDL setup bash文件(应该随IDL一起提供)。在v7.0.3之后,您可以显式设置的值!路径
作为字符串
您需要知道操作系统的搜索路径分隔符是什么。如果您使用的是IDL v5.5或更高版本,则可以定义:
sepath_sep = PATH_SEP(/SEARCH_PATH)
对于Linux,这可能是:
(至少对于Unix是这样)。您还需要知道当前的工作目录,该目录可以通过以下方式定义:
vern = !VERSION.RELEASE ;; e.g., '7.1.1'
test = (vern[0] GE '6.0')
IF (test[0]) THEN cwd_char = FILE_DIRNAME('',/MARK_DIRECTORY) ELSE cwd_char = '.'+slash[0]
cur_wdir = FILE_EXPAND_PATH(cwd_char[0])
;; Check for a trailing slash and add it if need be...
然后,要查找当前工作目录中的所有子目录,可以执行以下操作:
t_path0 = EXPAND_PATH('+'+cur_wdir[0],/ARRAY)
t_path = STRJOIN(t_path0,sepath_sep[0],/SINGLE)
通常,我会做不止一件事来确保IDL可以找到我的文件。我设置了一个环境变量并指定了!PATH
系统变量(我有v7.1.1)。您可以通过以下方式在IDL中执行此操作:
;; First define the location of the IDL libraries
def_idldir = !DIR ;; e.g., '/Applications/itt/idl71'
test = (GETENV('IDL_DIR') EQ '')
IF (test) THEN env_idldir = def_idldir[0] ELSE env_idldir = GETENV('IDL_DIR')
;; Again, check for trailing slash here and add if absent
IF (test) THEN SETENV,'IDL_DIR='+env_idldir[0]
;; First check whether an initial path exists
;; --> If not, set one
idlpath = GETENV('IDL_PATH')
test_idl = (idlpath[0] EQ '')
IF (test_idl) THEN new_path = t_path[0] ELSE new_path = t_path[0]+sepath_sep[0]+idlpath[0]
IF (test_idl) THEN SETENV,'IDL_PATH='+new_path[0]
;; Test to see if after version 7.0.3 and/or after version 6.2
test__62 = (vern[0] GE '6.2') AND (vern[0] LT '7.0.3')
test_703 = (vern[0] GE '7.0.3')
IF (test__62) THEN PREF_SET,'IDL_PATH',new_path[0],/COMMIT
IF (test_703) THEN !PATH = EXPAND_PATH(new_path[0])
这将为您提供正确的路径规格。我按照您所说的做<代码>打印,!path确实将我的路径添加到第一个位置,
cat
命令说pref-10…
是一个目录,我查看它,有一个名为cidl.pref的文件,其中有一行:
IDL\u path:+/mydirectory/Tools/IDL/:。我想这意味着一切都很顺利。但实际上,我再次启动了
IDL`,。运行我的文件
仍然不起作用,错误出现了<代码>打印,!路径排除我添加的路径,但“idl.pref”仍然存在。是否有启动文件?i、 例如,您是否设置IDL_启动首选项或环境变量?重新启动时可能会弄乱IDL\u路径。不,我不熟悉IDL,它应该在哪里?在我的主目录中,如.bashrc
和.profile
或IDL
的某个特殊位置?不,我认为每次启动IDL时,启动文件中的某些内容可能会破坏您的路径。但如果没有启动文件,那就不是了。最后要做的一件事是:1)使用PREF_SET
更改路径,2)退出IDL 3)启动IDL 4)退出IDL 5)再次启动IDL。现在检查您的!path
,可以吗?上面的内容都写在哪个文件中?在相应目录的.bashrc
或idl.pref
中?此外,我使用了idl8.4
,并找到了另一种成功添加路径的方法。我会编辑我的问题,让每个人都能看到。谢谢你的详细回答。我使用了一个启动例程,它的源代码类似于一个名为startup\u idl.pro
的批处理文件。例如,我在启动时执行以下操作:IDL>@startup\u IDL
。您也可以手动输入。我还在.bash\u profile
和IDL bash启动中设置了一些路径。请注意,如果在定义IDL\u PATH
环境变量的.bash\u profile
或.bashrc
文件中添加了export
语句,则不需要每次重新定义路径。我只在每次启动时这样做,因为我有多个库,其中的例程具有相同的名称,因此,我为不同的目的定义了不同的路径。@honeste_vive您可以设置IDL_启动首选项或环境变量,以便在每次启动IDL会话时自动运行启动批处理文件。@mgalloy-我使用一个bash函数来执行此操作并生成不同的启动文件。
;; First define the location of the IDL libraries
def_idldir = !DIR ;; e.g., '/Applications/itt/idl71'
test = (GETENV('IDL_DIR') EQ '')
IF (test) THEN env_idldir = def_idldir[0] ELSE env_idldir = GETENV('IDL_DIR')
;; Again, check for trailing slash here and add if absent
IF (test) THEN SETENV,'IDL_DIR='+env_idldir[0]
;; First check whether an initial path exists
;; --> If not, set one
idlpath = GETENV('IDL_PATH')
test_idl = (idlpath[0] EQ '')
IF (test_idl) THEN new_path = t_path[0] ELSE new_path = t_path[0]+sepath_sep[0]+idlpath[0]
IF (test_idl) THEN SETENV,'IDL_PATH='+new_path[0]
;; Test to see if after version 7.0.3 and/or after version 6.2
test__62 = (vern[0] GE '6.2') AND (vern[0] LT '7.0.3')
test_703 = (vern[0] GE '7.0.3')
IF (test__62) THEN PREF_SET,'IDL_PATH',new_path[0],/COMMIT
IF (test_703) THEN !PATH = EXPAND_PATH(new_path[0])