ディスクに保存せずにアーカイブスクリプト(.tar)を実行しましたが、その中のコマンドは認識されません。

ディスクに保存せずにアーカイブスクリプト(.tar)を実行しましたが、その中のコマンドは認識されません。

CentOSで.tarファイルにアーカイブされたスクリプトを実行したいのですが、実行しようとすると「読み取り」コマンドを認識しません。

主なアイデアは、このスクリプトを実行することです。ディスクに保存されない

  • リストの内容または.tarファイル tar -tf script.rar
  • リターン:teste-1.sh
[user@host]$ tar -tf script.rar 
teste-1.sh

ファイルを解凍するか、ファイルを解凍して実行してみてください。

  • tar -xvf script.rar | xargs bash
  • 商品を返すyour full info is:
[user@host]$ tar -xvf script.rar | xargs bash 
your full info is:  
[user@host]$ tar -xvf script.rar | bash -
bash: line 1: teste-1.sh: command not found
[user@host]$ tar -xvf script.rar | sh -
sh: line 1: teste-1.sh: command not found

上記のように、出力はコードの最後の行であり、読み取りプロンプトは表示されません。テスト目的でのみ使用される完全な単純なコードは次のとおりです。

#!/bin/bash
read -p "type your name:" name
read -p "type lastname:" lastname
echo "your full info is: $name $lastname"

手動でしようとするとうまくいきます(アーカイブする必要はありません)。

[user@host]$ ./teste-1.sh 
type your name:jhon
type lastname:doe
your full info is: jhon doe
  • | sh -を試してみましたが、| bash -成功しませんでした。興味深いアイデアがある人はいますか?とても感謝しています!

答え1

存在する

cmd1 | xargs cmd2

xargs出力を取得し、cmd1単語(スペースで区切り、独自の方法で引用符を理解)に分割し、そのcmd2単語を引数として使用して呼び出します。

tar -xvf somearchive、 を使用してtarディスクのアーカイブメンバーを抽出します。したがって、-vいくつかの出力も生成されますが、実装によっては、この出力はstdoutまたはstderrに表示され、フォーマットは実装ごとに大きく異なります。したがって、xargs bash標準入力には何も表示されないか、どの形式でもアーカイブされたメンバーのリストは表示されません。

したがって、両方のメソッドのいずれかが引数なしでxargs呼び出されます(stdin¹に入力された空のスクリプトは解釈され、何もしません)。bashbash

標準出力のアーカイブメンバーのみを出力するtar実装の場合(標準入力は空です)-vが呼び出されます。解凍を完了する前にアーカイブの標準出力を閉じないとbash teste-1.sh仮定すると、起動時にディスクに完全に抽出されたため、スクリプトを開いて解釈できる必要があります。tarteste-1.shbashbash

ここでファイルをディスクに抽出したくない場合は、次のパスを実行する必要があります。コンテンツteste-1.shアーカイブメンバーの値は、その中のコードを解釈するのでbashはなく、標準入力にあります。xargsbash

tar -xOf somearchive teste-1.sh | bash

-O一部のtar実装では、tarディスクにファイルを作成するのではなく、抽出されたメンバーの内容を標準出力にダンプすることをサポートしています。)

bashが解釈する複数のスクリプトを渡したくないので、抽出するアーカイブメンバーの名前を渡しています。アーカイブメンバーの名前は、リストされているとおりに正確に渡す必要がありますtar tf

test-1.shスクリプトが標準入力を読み取らないとします。その場合、bashスクリプト自体の内容も読みます。上記の他の場合は入力が空であるため、スクリプトは何も読みません。

これを防ぐ1つの方法は、次のように呼び出すことです。

bash <(tar -xOf somearchive test-1.sh)

今回は、スクリプトの内容が名前付きパイプのようにbashに渡されるので、stdinは影響を受けません。


xargs実装に応じて、xargs cmdinへの入力はと同じか(ここには空のパイプがあります)cmd(やはり空です)xargs/dev/null

関連情報