如何调用程序并将其传递给标准输入

时间:2016-10-02 00:15:08

标签: fortran system stdin execute

如何调用程序并将其传递给标准输入? Bash中的假设示例:

(echo abc; echo abba) | tr b B

请注意:

  • 我没有输入字符串(我在迭代时生成它)
  • 我不知道输入有多长
  • 输入可能跨越多行,如本例所示

我已经用其他19种语言写了这个,我通常采用的方法是获取程序标准输入的文件描述符,然后以与写入标准输出相同的方式写入文件描述符。 / p>

到目前为止我尝试过:基于Invoke external program and pass arguments我尝试将其传递给echo并使用shell来处理管道。如果我的输入中有单引号,这不起作用,如果我没有输入字符串(我没有),它就不起作用

Here是我的代码,目前试图通过计算将要打印的字符串(现在它失败)来实现它。

2 个答案:

答案 0 :(得分:0)

对于单引号,如何在每个引号(\)之前插入转义字符(')...?它似乎以某种方式为#" minimal"例如:

module utils
    implicit none
contains

function esc( inp ) result( ret )
    character(*), intent(in) :: inp
    character(:), allocatable :: ret
    integer :: i

    ret = ""
    do i = 1, len_trim( inp )
        if ( inp( i:i ) == "'" ) then
            ret = ret // "\'"
        else
            ret = ret // inp( i:i )
        endif
    enddo
endfunction

endmodule

program test
    use utils
    implicit none
    character(100) :: str1, str2
    integer i

    call getcwd( str1 )   !! to test a directory name containing single quotes
    str2 = "ab'ba"

    print *, "trim(str1) = ", trim( str1 )
    print *, "trim(str2) = ", trim( str2 )
    print *
    print *, "esc(str1) = ", esc( str1 )
    print *, "esc(str2) = ", esc( str2 )

    print *
    print *, "using raw str1:"
    call system( "echo " // trim(str1) // " | tr b B" )

    print *
    print *, "using raw str2:"
    call system( "echo " // trim(str2) // " | tr b B" )  !! error

    print *
    print *, "using esc( str1 ):"
    call system( "echo " // esc(str1)  // " | tr b B" )

    print *
    print *, "using esc( str2 ):"
    call system( "echo " // esc(str2)  // " | tr b B" )

    print *
    print *, "using esc( str1 ) and esc( str2 ):"
    call system( "(echo " // esc(str1) // "; echo " // esc(str2) // ") | tr b B" )

    ! pbcopy (copy to pasteboard; mac-only)
    ! call system( "(echo " // esc(str1) // "; echo " // esc(str2) // ") | pbcopy" )

endprogram

如果我们在目录/foo/baa/x\'b\'z中运行上述程序,我们将获得

 trim(str1) = /foo/baa/x'b'y
 trim(str2) = ab'ba

 esc(str1) = /foo/baa/x\'b\'y
 esc(str2) = ab\'ba

 using raw str1:
/foo/baa/xBy

 using raw str2:
sh: -c: line 0: unexpected EOF while looking for matching `''
sh: -c: line 1: syntax error: unexpected end of file

 using esc( str1 ):
/foo/baa/x'B'y

 using esc( str2 ):
aB'Ba

 using esc( str1 ) and esc( str2 ):
/foo/baa/x'B'y
aB'Ba

答案 1 :(得分:0)

这就是我所说的 minimal 示例。

 call execute_command_line("(echo ""hexxo world"";echo abba)|tr x l")
 end
  hello world
  abba

这不是你要求的,调用tr并传递标准输入吗?