【问题标题】:freesurfer command running from shell but not from scriptfreesurfer 命令从 shell 运行,但不是从脚本运行
【发布时间】:2018-05-04 02:52:16
【问题描述】:

我想用 freesurfer 的 lta-convert 转换一个变换矩阵。 如果我在我的 bash-shell 中运行以下命令(echo $0 显示 -bash)

lta_convert -inlta input.lta --outfsl output.mat

它运行没有问题:

$Id: lta_convert.cpp,v 1.9.2.1 2016/08/09 02:33:22 zkaufman Exp $

--inlta: input.lta input LTA transform.
--outfsl: output.mat output FSL matrix.
 LTA read, type : 1
 0.93123   0.02020   0.00726  -12.56508;
-0.00133   0.92407   0.00102  -2.41168;
 0.00007   0.02780   1.00388   21.38016;
 0.00000   0.00000   0.00000   1.00000;
FSLOUTPUTTYPE NIFTI_GZ 
tkreg2FSL: mov det = 8, ref det = 1
INFO: FSL2FreeSurfer: Mov volume is NIFTI with positive det,
  applying LR flip to registration matrix.
INFO: FSL2FreeSurfer: Ref volume is NIFTI with positive det,
  applying LR flip to registration matrix.
lta_convert successful.`

但如果我尝试在包含以下两行的 shell 脚本中运行相同的命令:

#!/bin/bash

lta_convert -inlta input.lta --outfsl output.mat

它给我一个错误。

$Id: lta_convert.cpp,v 1.9.2.1 2016/08/09 02:33:22 zkaufman Exp $

dyld: lazy symbol binding failed: Symbol not found: ___emutls_get_address
  Referenced from: /Applications/freesurfer/bin/../lib/gcc/lib/libgomp.1.dylib
  Expected in: /usr/lib/libSystem.B.dylib

dyld: Symbol not found: ___emutls_get_address
  Referenced from: /Applications/freesurfer/bin/../lib/gcc/lib/libgomp.1.dylib
  Expected in: /usr/lib/libSystem.B.dylib

./test.sh: line 3: 91440 Abort trap: 6           lta_convert -inlta input.lta --outfsl output.mat

为什么会发生这种情况,我该如何解决? 其他 freesurfer 命令(如 mri_robust_register)从 shell 运行时没有问题。我在 Mac OS 10.12.4 上运行脚本。

【问题讨论】:

    标签: bash shell


    【解决方案1】:

    您遇到的问题可能与环境变量 DYLD_LIBRARY_PATH 由于系统完整性保护而未传播有关。在您的情况下,解决方法是在 freesurfer 工作时检查 DYLD_LIBRARY_PATHLD_LIBRARY_PATH 的值,并在运行之前在 bash 脚本中设置这些变量。

    以下问题中有更多信息:Why Isn't DYLD_LIBRARY_PATH being propagated here?

    【讨论】:

      【解决方案2】:

      找到了解决办法。在脚本中添加一行,使其显示:

      #!/bin/bash
      
      source $FREESURFER_HOME/SetUpFreeSurfer.sh
      lta_convert -inlta input.lta --outfsl output.mat
      

      【讨论】: