SSHリモートコールコマンドの置換が失敗するのはなぜですか?

SSHリモートコールコマンドの置換が失敗するのはなぜですか?

このスクリプトがあります。

exportFile(){
    file=$1
    skippedBytes=$2
    exportCommandString=$3

    #This works:
    #dd if=$file bs=1 skip=$skippedBytes | ssh sshConnection 'cat - >> /remote/dir/myTarget.txt.output' > export.output 2>&1

    #This does not work:
    dd if=$file bs=1 skip=$skippedBytes | $($exportCommandString $file) > export.output 2>&1

    cat export.output
}

sshExportCommand(){
    userAtServer=$1
    targetDir=$2
    filename=$3
    echo 'ssh '$userAtServer' '\''cat - >> '$targetDir'/'$filename'.output'\'
    #Same result with this:
    #echo "ssh $userAtServer 'cat - >> $targetDir/$filename.output'" 
}

exportFile mySource.txt 9 "sshExportCommand sshConnection /remote/dir myTarget.txt"

呼び出すと、次のような結果が表示されます。

85+0 records in
85+0 records out
85 bytes (85 B) copied, 0.00080048 s, 106 kB/s
Read bytes: 85
ovh_ssh: cat - >> /remote/dir/myTarget.txt.output: No such file or directory

何が動作を妨げますか?これはコマンドの置き換えですか?私がまた逃したことがありますか?

ベストアンサー1

コメントアウトされたコード行に書かれているように、次は実行中です。

byteCount=$( exec 3>&1 ; dd if=$file bs=1 skip=$skippedBytes | tee -a >(wc -c >&3) -a $file.output | ssh sshConnection 'cat - >> /remote/dir/myTarget.txt.output' > export.output 2>&1 ; 3>&1 )

したがって、この知識を適用し、このリファクタリングを使用してください。

exportFile(){
   file=$1
   skippedBytes=$2
   userAtServer=$3
   targetDir=$4
   targetFile=$5
   rm export.output

   byteCount=$( exec 3>&1 ; dd if=$file bs=1 skip=$skippedBytes | tee -a >(wc -c >&3) -a $file.output | ssh ${userAtServer} "cat - >>$targetDir/${targetFile}" > export.output 2>&1 ; 3>&1 )

   echo "Read bytes: $byteCount"
   cat export.output
 }
 exportFile mySource.txt 9 sshConnection /remote/dir myTarget.txt

おすすめ記事