タグ付けされた質問 「command-substitution」

シェルコマンド置換($(command)または `command`など)、そのメカニズム、正しい構文などに関する質問。エイリアスと混同しないでください。


3
Bashの$(コマンド置換)内での引用
Bash環境では、スペースを含む変数を使用し、これらの変数をコマンド置換内で使用します。残念ながら、SEで答えが見つかりません。 変数を引用する正しい方法は何ですか?そして、これらがネストされている場合はどうすればよいですか? DIRNAME=$(dirname "$FILE") または、置換外で引用しますか? DIRNAME="$(dirname $FILE)" または両方? DIRNAME="$(dirname "$FILE")" またはバックティックを使用しますか? DIRNAME=`dirname "$FILE"` これを行う正しい方法は何ですか?そして、引用符が正しく設定されているかどうかを簡単に確認するにはどうすればよいですか?

7
前のコマンドの出力を引数としてnextに渡します
データを標準出力(command1 -p=aaa -v=bbb -i=4)に出力するコマンドがあります。出力行には次の値を設定できます。 rate (10%) - name: value - 10Kbps その「レート」を保存するために、その出力をgrepしたいです(ここでパイプが役立つと思います)。そして最後に、そのレートを2番目のコマンドのパラメーターの値にしたいと思います(言いましょうcommand2 -t=${rate}) 私の側には注意が必要です。パイプ、grep、sedなどの使用方法を詳しく知りたいと思います。 私はそのような組み合わせをたくさん試しましたが、私はこれらを混同しています: $ command1 -p=aaa -v=bbb -i=4 | grep "rate" 2>&1 command2 -t="rate was "${rate}

6
cronタブジョブ内で「日付」を実行するにはどうすればよいですか?
ログファイル名に現在の時間が含まれているcronスクリプトのログファイルを作成したい。これは私が使用しようとしたコマンドです: 0 * * * * echo hello >> ~/cron-logs/hourly/test`date "+%d"`.log 残念ながら、それが実行されるとこのメッセージが表示されます。 /bin/sh: -c: line 0: unexpected EOF while looking for matching ``' /bin/sh: -c: line 1: syntax error: unexpected end of file dateさまざまな方法でパーツをエスケープしようとしましたが、あまり運がありません。これをcrontabファイルでインラインで実行することは可能ですか、またはこれを行うためにシェルスクリプトを作成する必要がありますか?


3
バックティックを理解する( `)
私はコマンドを試しています $ b=5; echo `$b`; -bash: 5: command not found ただし、想定どおり5は出力されません。ここに何が欠けていますか? コマンドで `(バッククォート/バックティック)はどういう意味ですか?`内のコマンドを評価し、それらを出力に置き換えると言っているようです。

6
コマンド置換:スペースではなく改行で分割
私はこの問題をいくつかの方法で解決できることを知っていますが、bashビルトインのみを使用してそれを実行する方法があるかどうか、そしてそうでない場合、最も効率的な方法は何ですか? 次のような内容のファイルがあります AAA B C DDD FOO BAR つまり、複数の行があり、各行にスペースがある場合とない場合があります。次のようなコマンドを実行したい cmd AAA "B C DDD" "FOO BAR" 使用するcmd $(< file)と cmd AAA B C DDD FOO BAR そして、私が使うなら、私はcmd "$(< file)"得る cmd "AAA B C DDD FOO BAR" 各行を1つのパラメーターだけで処理するにはどうすればよいですか?

5
shell command Substitutionが末尾の改行文字を飲み込むのはなぜですか?
次の例と、最近の質問 bashのように、末尾の改行文字はどこに消えましたか?、「なぜ」それが起こるのか知りたい x="$(echo -ne "a\nb\n")" ; echo -n "$x" | xxd -p # Output is: 610a62 # The trailing newline from the 'echo' command # has been "deleted" by Command Substitution 私は、シェルアクション、つまりコマンド置換から、置換しているコマンド出力からいくつかのデータを実際に削除するための非常に重要な理由 があるはずだと思います... しかし、私はこれを回避することができませんそれがすることになっているもののアンチテーゼ... コマンドの出力をスクリプトプロセスに戻す... 1つの文字を保持することは奇妙に思えますが、それには理にかなった理由があると思います...その理由が何かを知りたいと思っています。 。

4
`curl | sh`と `sh -c“ $(curl)”`?
この質問は、UnixおよびLinux Stack Exchangeで回答できるため、Server Faultから移行されました。 2年前に移行され ました。 (たとえば)Dockerの簡単なインストール方法の1つは次のとおりです。 curl -sSL https://get.docker.com/ | sh ただし、次のようなものも見ました(Dockerの例を使用): sh -c "$(curl -sSL https://get.docker.com/)" 機能的には同じように見えますが、一方を他方よりも使用する理由はありますか?それとも、単に好み/美学のものですか? (注意してください、未知の起源からスクリプトを実行するとき、非常に注意してください。)

1
バックグラウンドプロセスが終了するまで関数が戻らないのはなぜですか?
次のスクリプトを検討してください。 #!/bin/bash function start { leafpad & echo $! } PID=$(start) echo "PID is $PID" このスクリプトは、バックグラウンドプロセスであっても、リーフパッドプロセスが終了するまで閉じかっこを通過し続けません。 どうしてこれなの?関数からバックグラウンドプロセスを起動することはできますか?

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>を除く)が含まれます。引用テキストの。 これについての私の解釈は$(、終了するまでのすべての文字が)逐語的にシェルスクリプトを構成するということです。ヒアドキュメントが表示されるため、ヒアドキュメントの処理は通常のトークン化の代わりに行われます。ヒアドキュメントには、引用符で囲まれた区切り文字があり、その内容は逐語的に処理されます。エスケープ文字が含まれることはありません。しかし、このケースは単に対処されておらず、両方の動作が許容されるという議論を見ることができます。関連するテキストをどこかでスキップした可能性もあります。 この状況は他の場所でより明確になっていますか? (理論上)移植可能なスクリプトは何に依存できるはずですか? …

2
高度に投票されたワンライナーのネストされた二重引用符
3.5Kを超える票を含むStackOverflowの回答にDIRは、現在のbashスクリプトのディレクトリに割り当てるためのこの1つのライナーが含まれています。 DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" ネストされた二重引用符に困惑しています。私が知る限り、次のフラグメントは二重引用符で囲まれています。 "$( cd " "${BASH_SOURCE[0]}" " && pwd )" ...そして、=($( dirnameおよび))の右側にある他のものはすべて引用符で囲まれていません つまり、2番目、4番目、および6 "番目の"文字は、それぞれ1番目、3番目、および5 番目の文字を「閉じる」と仮定します。 二重引用符で"${BASH_SOURCE[0]}"何が達成されるのか理解していますが、他の2組の二重引用符の目的は何ですか? 一方、(および高い得点にもかかわらず)上記のスニペットが正しくない場合、名目上の意図を達成する正しい方法は何ですか? (名目上の意図ではpwd、最初にcd-ingの後に返された値をで返されたディレクトリに収集dirname "${BASH_SOURCE[0]}"し、cdサブシェルで-ing を実行し$PWD、親シェルのが変更されないようにします)。


1
$(command $ arg)を引用する正しい方法は何ですか?
長年私を悩ませてきたこの難問を解決する時が来ました... 私は時々これに会ってきました、そして、これが行く方法であると思いました: $(comm "$(arg)") そして、私の見解は経験に強く支えられていると思いました。しかし、私はもうよくわかりません。Shellcheckでも決心することはできません。両方です: "$(dirname $0)"/stop.bash ^-- SC2086: Double quote to prevent globbing and word splitting. そして: $(dirname "$0")/stop.bash ^-- SC2046: Quote this to prevent word splitting. 背後にあるロジックは何ですか? (これはShellcheckバージョン0.4.4、btwです。)

3
新しい開発の代わりに「…」を使用または教える理由はありますか?
エラーを起こしやすいネストやエスケープの構文がより簡単で、少ないため$(...)、古い`ベースの構文よりも最新のコマンド置換構文の方が好ましいことを理解しています。 さらに、/bin/sh現代の使用のほとんどのスタイルのシェルがサポートしているよう$(…)です: バッシュ ash(したがってBusyBox、ほとんどの組み込みLinux) ダッシュ FreeBSD / bin / sh そして、$(…)IEEE 1003.1で指定されています。 だから私は2つの非常に関連した質問があります スクリプトを実行する必要がある特定の古いシステムを知らない限り、シェルスクリプトの新しい開発で `を使用する理由はありますか? 書くだけでUNIXプログラミングの学生に教えない理由はありますか?他の開発者のシェルスクリプトを読んでいる場合に遭遇する可能性があり、本当に古いシステムまたは非標準で作業している場合に必要になる可能性のある古いバリアントとしてのみ$(...)議論します`何らかの理由で)?

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.