如何调用程序并将其传递给标准输入? Bash中的假设示例:
(echo abc; echo abba) | tr b B
请注意:
我已经用其他19种语言写了这个,我通常采用的方法是获取程序标准输入的文件描述符,然后以与写入标准输出相同的方式写入文件描述符。 / p>
到目前为止我尝试过:基于Invoke external program and pass arguments我尝试将其传递给echo并使用shell来处理管道。如果我的输入中有单引号,这不起作用,如果我没有输入字符串(我没有),它就不起作用
Here是我的代码,目前试图通过计算将要打印的字符串(现在它失败)来实现它。
答案 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
并传递标准输入吗?