我正在尝试使用现有的代码库但遇到了问题.简而言之,我执行一个shell脚本(让我们称之为这个A),其第一步是调用另一个脚本(B).脚本B在我当前的目录中(我正在使用的程序的要求).该软件的手册参考了bash,但是评论A表明它是在开发的ksh.bash到目前为止我一直在经营.
在内部A,要执行的行B是:
. B
Run Code Online (Sandbox Code Playgroud)
它使用"点空间"语法来调用程序.它没有做任何不寻常的事情sudo.
当我在A没有点空格语法的情况下调用时,即:
./A
Run Code Online (Sandbox Code Playgroud)
它总是错误,说它找不到文件B.我说pwd,ls,whoami,echo $SHELL,和echo $PATH线A调试和确认,B实际上是在那里,脚本与相同的运行$SHELL,因为我在命令提示符下,脚本是相同的用户,因为我,和脚本有$PATH和我一样的搜索路径.我还验证了我是否这样做:
. B
Run Code Online (Sandbox Code Playgroud)
在命令行,它工作得很好.但是,如果我将内部语法更改A为:
./B
Run Code Online (Sandbox Code Playgroud)
相反,然后A成功执行.
同样,如果我执行A与点空间句法,那么这两个. B和./B工作.
总结:
./A仅在A包含./B语法时才有效.
. …
给定这样的文件:
a
b
a
b
Run Code Online (Sandbox Code Playgroud)
我希望能够用来sed替换文件中包含"a"实例的最后一行.因此,如果我想用"c"替换它,那么输出应该如下所示:
a
b
c
b
Run Code Online (Sandbox Code Playgroud)
请注意,无论可能遇到多少匹配,或者确切了解所需模式或文件内容的详细信息,我都需要这样做.提前致谢.
免责声明:我很确定这已在某个地方得到解答,但我和其他人一直在努力寻找无济于事.
我有一个看起来像这样的代码:
PROGRAM main
!$omp parallel do
!$omp private(somestuff) shared(otherstuff)
DO i=1,n
...
CALL mysubroutine(args)
...
a=myfunction(moreargs)
...
ENDDO
!$omp end parallel do
END PROGRAM
SUBROUTINE mysubroutine(things)
...
END SUBROUTINE
FUNCTION myfunction(morethings)
...
END FUNCTION
Run Code Online (Sandbox Code Playgroud)
我无法确定子程序和函数中变量的私有,共享,减少等子句的位置和方式.我怀疑答案可能会有一些细微差别,因为变量可能在很多很多方面被声明并在它们之间共享.因此,假设主程序所关注的所有变量都在其中或在共享模块中定义,并且可以在主代码中处理对这些变量的任何OMP操作.子例程和函数使用其中的一些变量,并拥有一些自己的变量.所以,我认为问题归结为如何处理其局部变量的子句.
我在阅读声明方面遇到了麻烦.我更喜欢Fortran90,但如果它有帮助,其他版本可能是可能的.我在文件中有一堆数据,可以描述为:
这是一个例子:
maxele/OS1_HC_LF_A_0001_004_maxele.63 4.22E-03 9.00E-01 1.00E-06 1 -999 -999 -999
maxele/OS1_Inl_A_0001_005_maxele.63 2.11E-03 9.00E-01 1.00E-06 3 -999 -999 -999
maxele/OS1_HC_LF_C_0001_009_maxele.63 1.56E-03 9.00E-01 1.00E-06 2 58.77 -82.82 28.91
maxele/OS1_TS_B_0001_006_maxele.63 3.90E-03 9.00E-01 1.00E-06 1 -999 -999 -999
Run Code Online (Sandbox Code Playgroud)
我已经了解到如果遇到无格式读取的斜杠(/)字符,Fortran将停止读取语句,因此我必须使用格式说明符.并且由于字符串长度未知,我不确定如何确保字符串读取在第一个空格处停止.我相信它可以在整行中阅读,然后再进行解析,但这看起来很复杂.有没有办法强迫它将数据视为空格分隔?提前致谢.
为了调试我的脚本,我想在每个输出的开头添加内部变量$ FUNCNAME和$ LINENO,所以我知道输出发生在哪个函数和行号上.
foo(){
local bar="something"
echo "$FUNCNAME $LINENO: I just set bar to $bar"
}
Run Code Online (Sandbox Code Playgroud)
但是由于会有很多调试输出,如果我可以执行以下操作,它会更清晰:
foo(){
local trace='$FUNCNAME $LINENO'
local bar="something"
echo "$trace: I just set bar to $bar"
}
Run Code Online (Sandbox Code Playgroud)
但上面的字面输出:"$ FUNCNAME $ LINENO:我只是设置了一些东西"我认为这样做是因为双引号只扩展了一次内部的变量.
是否有一种语法上干净的方法在同一行中扩展变量两次?
linux bash parameter-passing variable-expansion parameter-expansion
我正在研究一组严重 I/O 绑定的 Fortran 程序,因此我正在尝试对其进行优化。我在多个 地方读到写整个数组比单个元素WRITE(10)arr快,即比DO i=1,n; WRITE(10) arr(i); ENDDO. 但是,我不清楚我的案子在这方面会落在哪里。从概念上讲,我的代码类似于:
OPEN(10,FILE='testfile',FORM='UNFORMATTED')
DO i=1,n
[calculations to determine m values stored in array arr]
WRITE(10) m
DO j=1,m
WRITE(10) arr(j)
ENDDO
ENDDO
Run Code Online (Sandbox Code Playgroud)
但是m每次DO i=1,n循环都可能发生变化,因此写入整个数组arr不是一种选择。因此,折叠 DO 循环以进行写入最终会得到WRITE(10) arr(1:m),这与写入整个数组不同。这是否仍然可以加快写作速度,那么阅读呢?我可以在计算后分配一个大小为 m 的数组,将值分配给该数组,写入它,然后释放它,但这似乎太复杂了。
我还看到了有关隐含 DO 循环写入的不同信息,即WRITE(10) (arr(j),j=1,m)它们是否有助于/损害 I/O 开销。
我现在正在运行几个测试,并打算更新我的观察结果。其他适用的建议
额外细节: