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¹に入力された空のスクリプトは解釈され、何もしません)。bash
bash
標準出力のアーカイブメンバーのみを出力するtar実装の場合(標準入力は空です)-v
が呼び出されます。解凍を完了する前にアーカイブの標準出力を閉じないとbash teste-1.sh
仮定すると、起動時にディスクに完全に抽出されたため、スクリプトを開いて解釈できる必要があります。tar
teste-1.sh
bash
bash
ここでファイルをディスクに抽出したくない場合は、次のパスを実行する必要があります。コンテンツteste-1.sh
アーカイブメンバーの値は、その中のコードを解釈するのでbash
はなく、標準入力にあります。xargs
bash
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 cmd
inへの入力はと同じか(ここには空のパイプがあります)cmd
(やはり空です)xargs
/dev/null