タグ付けされた質問 「here-document」

5
ネストのインデントと一致するようにヒアドキュメントをインデントできません
スクリプティングに「最初の世界の問題」がある場合、これがそれです。 更新するスクリプトに次のコードがあります。 if [ $diffLines -eq 1 ]; then dateLastChanged=$(stat --format '%y' /.bbdata | awk '{print $1" "$2}' | sed 's/\.[0-9]*//g') mailx -r "Systems and Operations <sysadmin@[redacted].edu>" -s "Warning Stale BB Data" jadavis6@[redacted].edu <<EOI Last Change: $dateLastChanged This is an automated warning of stale data for the UNC-G Blackboard Snapshot …

2
ヒアドキュメントと猫と組み合わせて出力リダイレクトをどのように使用しますか?
別のコマンドにパイプする、またはファイルにリダイレクトする(sh例のためにパイプする)スクリプトがあるとしましょう。私はbashを使用していると仮定します。 私はそれを使用してそれを行うことができますecho: echo "touch somefile echo foo > somefile" | sh 私もほとんど同じことをすることができますcat: cat << EOF touch somefile echo foo > somefile EOF しかし、「EOF」を「EOF | sh」に置き換えると、それは単にヒアドキュメントの一部であると考えるだけです。 cat標準入力からテキストを出力し、それを任意の場所にパイプで送るようにするにはどうすればよいですか?

1
POSIXは、コマンド置換内の引用されたヒアドキュメントに何を必要としますか?
で、この質問の誰かが使用して問題を報告し、ここで文書を内部に引用された区切り文字の単語で$(...)コマンド置換バックスラッシュ、\文書トリガーの内部の行末の改行結ぶラインの継続が、ここでは同じながら、文書外予想通りコマンド置換の作品を。 簡単なドキュメントの例を次に示します。 cat <<'EOT' abc ` def ghi \ jkl EOT これには、行末に1つのバックティックと1つのバックスラッシュが含まれます。区切り文字は引用符で囲まれているため、本体内で展開は発生しません。すべてのBourne-alikesで、これはコンテンツを逐語的に出力します。次のようにコマンド置換内に同じドキュメントを配置した場合: x=$(cat <<'EOT' abc ` def ghi \ jkl EOT ) echo "$x" その後、それらは同じ動作をしなくなります。 dash、ash、zsh、ksh93、BusyBoxのはash、mksh、とSunOS 5.10 POSIXは、sh以前のように、すべて、文書の逐語的な内容を与えます。 Bash 3.2では、一致しないバックティックに対して構文エラーが発生します。一致したバックティックを使用して、コマンドとしてコンテンツを実行しようとします。 Bash 4.3は、「ghi」と「jkl」を1行にまとめますが、エラーはありません。--posixオプションでは、この影響を与えません。Kusalananda はpdksh、同じように振る舞うと言っています(ありがとう!)。 元の質問で、これはBashのパーサーのバグだと言いました。それは...ですか?[更新:yes ] POSIXからの関連テキスト(すべてシェルコマンド言語定義から)は、次のとおりです。 §2.6.3コマンドの置換: $(command)形式では、開き括弧から対応する閉じ括弧までのすべての文字がコマンドを構成します。commandには、任意の有効なシェルスクリプトを使用できます。ただし、不特定の結果を生成するリダイレクトのみで構成されるスクリプトは除きます。 §2.7.4ヒアドキュメント: 単語の一部が引用されている場合、区切り文字はwordの引用削除を実行して形成され、ヒアドキュメントの行は展開されません。 §2.2.1エスケープ文字(バックスラッシュ): <バックライン>の後に<改行>が続く場合、シェルはこれを行の継続と解釈します。<backslash>と<newline>は、入力をトークンに分割する前に削除されます。 §2.3トークンの認識: 場合io_hereトークンが文法によって認識されている(シェル文法を、一つ以上のすぐ隣次以降の行の)改行が一つ以上のここで、ドキュメントの本体を形成トークンとの規則に従って解析されなければなりませんHere-ドキュメント。 io_hereを処理していない場合、シェルは、入力内の次の文字に以下の最初の適用可能なルールを適用することにより、入力をトークンに分割します。... ... 現在の文字が<バックスラッシュ>、一重引用符、または二重引用符であり、引用されていない場合、引用されたテキストの最後までの後続の文字の引用に影響します。引用のルールは、引用で説明されています。トークンの認識中、実際には置換は行われず、結果のトークンには、入力に含まれる文字(<newline>を除く)が含まれます。引用テキストの。 これについての私の解釈は$(、終了するまでのすべての文字が)逐語的にシェルスクリプトを構成するということです。ヒアドキュメントが表示されるため、ヒアドキュメントの処理は通常のトークン化の代わりに行われます。ヒアドキュメントには、引用符で囲まれた区切り文字があり、その内容は逐語的に処理されます。エスケープ文字が含まれることはありません。しかし、このケースは単に対処されておらず、両方の動作が許容されるという議論を見ることができます。関連するテキストをどこかでスキップした可能性もあります。 この状況は他の場所でより明確になっていますか? (理論上)移植可能なスクリプトは何に依存できるはずですか? …

1
ヒアドキュメントで変数を渡し、設定する
私は、さまざまなリモートマシンでさまざまなことをしなければならないスクリプトを持っています。ヒアドキュメントはこれでうまくいくと思いましたが、スクリプトの他の場所で定義された変数と、ヒアドキュメントで定義された変数を使用することはできません。 コードは次のとおりです。 #!/bin/sh FOO="foo" ssh some.remote.host << EOF BAR="bar" echo "FOO=$FOO" echo "BAR=$BAR" EOF これは、次のもののみを印刷します。 FOO = BAR = bar ただし、EOF行を次のように引用すると ssh some.remote.host << "EOF" 、次のように出力されます。 FOO = foo BAR = ヒアドキュメント内で両方の変数を使用する方法についてのヒントはありますか? ありがとう。

3
bashスクリプトエラーstty:標準入力:デバイスの不適切なioctl
パスワードが何度も必要なインストールとセットアップを自動化するために、bashスクリプトでヒアドキュメントを使用しています。パスワードを1回入力すると、スクリプトはそれをさまざまなコマンドに渡します。ほとんどの場合、ヒアドキュメントアプローチがこの罰金を処理します。ただし、ある場合にはこのエラーが発生します。 Enter VNC password: stty: standard input: Inappropriate ioctl for device Verify password: stty: standard input: Inappropriate ioctl for device このエラーメッセージはx11vnc -storepassword(ではなく)からのものであることに注意してくださいsudo。 私の問題は関連してx11vnc -storepasswdおり、ここに私のコードがあります: sudo x11vnc -storepasswd ~/.vnc/passwd << ENDDOC password password y ENDDOC それは明らかに(エラーから)動作しません。sudo x11vnc -storepasswd ~/.vnc/passwdスクリプトに実装する方法の実用例に感謝します。 役立つ場合、プロンプトは次のようになります。 VNCパスワードの入力:パスワードの 確認: /home/user/.vnc/passwdにパスワードを書き込みますか?[y] / nn 使用expectする方が良い解決策でしょうか?もしそうなら、この場合どのように使用しますか?(これまで使用expectしたことはありませんが、この質問を投稿してから多くの例を見てきましたexpect。自分で作業することはできません。)

1
bashで複数のhere-docsを使用することは可能ですか?
複数のヒアドキュメントを使用して、bashのコマンドに入力を提供できますか? $ cat <<<foo <<<bar bar $ cat <<EOF1 <<EOF2 > foo > EOF1 > bar > EOF2 bar 明らかに、どちらの場合でも、2番目のhere-docはstdinとして使用され、最初の参照を置き換えます。echo代わりにs を使用するソリューションですか? $ cat <(echo -n foo) <(echo bar) foobar また、何らかの理由で、組み合わせを使用してもうまくいきませんでした。どうしてですか? $ cat <<<foo <(echo bar) bar $ cat <(echo -n foo) <<<bar foo

3
Bashのプロセス置換をHEREドキュメントと組み合わせる方法は?
Bashバージョン4.2.47(1)-releaseで、HERE-dcoumentからのフォーマットされたテキストを次のように分類しようとすると: cat <(fmt --width=10 <<FOOBAR (I want the surrounding parentheses to be part of the HERE-document) (Even the preceding unbalanced parenthesis should be part of it. FOOBAR ) # I want this paranthesis to end the process substitution. 次のエラーが表示されます。 bash: bad substitution: no closing `)' in <(fmt --width=10 <<FOOBAR (I …

3
「cat> file_name << blah」コマンドの理解方法
次のコマンドでは、catはhere-docのコンテンツを取得し、confという名前のファイルにリダイレクトします。 cat &gt; conf &lt;&lt; EOF var1="cat" var2="dog" var3="hamster" EOF ここでコマンドの順序を理解する方法は?いbash最初のプロセスのすべての他の(ここでは-docの部分)と最終ステップとしては、それが見える&gt; conf部分を?

2
新しいtmuxセッションでコードを実行する方法-現在のセッション内から?
私はUbuntu 16.04を使用tmuxしsleepていますが、特定のケースで満足しておらずat、バグに遭遇したためnohup(タイムアウト時)にタイムアウトプロセスを実行したいため、次のソリューションが必要です(を組み合わせた場合nohup-sleep)。今、tmuxそれは独自のハングアップメカニズムを備えており、手動での使用で実際にうまく機能しているため、最良の選択肢のようです(私はすでにそれで手動で行うことができるプロセスを自動化することに関してのみ質問します)。 必要なもの: 次の3つのアクションをすべて1つの操作で実行する方法が必要です。 新しいtmuxセッションを接続します。 のようなコマンドの準備が整ったセットをそのセッションに注入します(sleep 30m ; rm -rf dir_name ; exit)。私は特に、1行の長い行ではなく、複数行のセットを好みます。 上記のコマンドを実行すると、新しいtmuxセッションでstdinとして書き込まれることが終了した瞬間が設定されます。 言い換えると、tmuxその原因のために特別に作成された別のセッションでコードセットを実行したいが、1つの操作ですべてを実行したい。 ノート: 私は元の作業セッション(ほとんどの時間から作業しているセッション)からすべてを行うことを目指しています。一般的に、新しく作成されたセッションにアクセスするつもりはありません。自動的に実行されるコードで作成したいだけです。 可能であれば、heredocソリューションをお勧めします。私はそれが最も効率的だと思います。

4
ヒアドキュメントのJSONコンテンツが解析できないのはなぜですか?
JSONフラグメントがあります。 以下は機能しません。 VALUE=&lt;&lt;PERSON { "type": "account", "customer_id": "1234", "customer_email": "jim@gmail.com" } PERSON echo -n "$VALUE" | python -m json.tool 結果は次のとおりです。 JSONオブジェクトをデコードできませんでした で同じことを行うjq、すなわち echo -n "$VALUE" | jq '.' 出力はありません。 以下についても同じ動作があります。 VALUE=&lt;&lt;PERSON '{ "type": "account", "customer_id": "1234", "customer_email": "jim@gmail.com" }' PERSON echo -n "$VALUE" | python -m json.tool 応答: JSONオブジェクトをデコードできませんでした しかし、次の作品: …

3
bash:読み取り専用ルートパーティションでread <<<“ $ VARIABLE”を使用する際の問題。既知の回避策はありますか?
偶然にも、ATA-ID-to-device-nameスクリプトを使用する必要がありました(/server/244944/linux-ata-errors-translating-to-a-device-name/にあります) 426561#426561)読み取り専用 /パーティション。気になる方のために言うと、これはUbuntuの回復コンソールで、/パーティションにアクセスできますが、デフォルトでは読み取り専用でマウントされます。それがなければ、スクリプトが特定の行のためにR / Oシステムで奇妙な動作をすることをおそらく私が知ることはなかったでしょう。 IFS=: read HostMain HostMid HostSub &lt;&lt;&lt; "$HostFull" これは、書き込み権限がない場合は機能しません。しかし、失敗するとは思いませんでした。しかし、どうやら&lt;&lt;&lt;オペレーターはどこかに一時ファイルを書き込む必要があります。 しかし、一時ファイルの作成を回避する方法はありますか、または、ファイルが書き込まれる場所を指定する方法はありますか?Ubuntuの回復コンソールには、/runディレクトリに書き込み権限がありreadます。これは、一時ファイルを通常とは別の場所に「伝える」ことができた場合にそうなります。

3
SQLクエリの出力を変数に割り当てる
Oracleデータベースに接続してクエリを実行し、出力を変数に割り当てていますが、変数の値をエコーすると、正しく出力されません。 count=`sqlplus -s $configuser/$configpass@$ORACLE_SID &lt;&lt;END set pagesize 0 feedback off verify off heading off echo off; select max(cust_id) from cutomers exit; END` echo $count クエリは、データベースで実行されると正しい結果を返します。しかし、「カウント」変数の値が正しくありません。

3
`sed`とファイルにhere-docを使用する
ヒアドキュメントをsedコマンドに使用し、読み取るファイルと出力ファイルを提供したいと思います。 私は、高度なBashスクリプトガイドのヒアドキュメントを見てきましたが、ヒアドキュメントを使用する際の通常の引数については何も触れていません。可能ですか? 私は次のようなことを達成したいと思います: #!/bin/bash OUT=/tmp/outfile.txt IN=/my_in_file.txt sed $IN &lt;&lt; SED_SCRIPT s/a/1/g s/test/full/g SED_SCRIPT &gt; $OUT; どんな助けでも本当に感謝しています。

1
catを使用して変数をファイルにエコーする方法は?
私はこのような簡単なスクリプトを持っています: #!/bin/bash BOO=bla-bla-bla cat &gt; ./Makefile &lt;&lt;'EOF' Hello INCLUDES := -I/data/opt/include/ -Ideps/ -I$BOO/include EOF それでもファイルに出力します: Hello INCLUDES := -I/data/opt/include/ -Ideps/ -I$BOO/include cat文字列内の名前ではなく、変数値を使用する方法

2
'EOF'を使用し、変数をリテラルと見なすbashスクリプトに変数を渡す[クローズ]
休業。この質問には詳細または明確さが必要です。現在、回答を受け付けていません。 この質問を改善してみませんか?詳細を追加し、この投稿を編集して問題を明確にしてください。 5年前休業。 このスクリプトでは、 "$ 1"が/ testファイルに保存されることになります。 #!/bin/bash cat &gt; /test &lt;&lt; 'EOF' $1 EOF 真実は..私は保つ必要があります 'EOF' 引数($ 1)にドル記号が含まれているため、「EOF」として。 $ 1ではなく、その引数を保存する必要があります
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.