シェル展開を印刷することは可能ですか?


18

ユーザーが入力したコマンドをシェルが展開するルールの特定のセットがあることを知っています。(bashシェルについて話しましょう。)

シェル展開後にフォームにコマンドを印刷することは可能ですか?シェルが特殊文字をどのように展開するかを学び、確認するのは良いユーティリティのようです。

例えば

$ echo *

{all the filenames in current dir}

次の行である拡張コマンドを印刷します。

echo {all the filenames in .}

回答:


13

使用するだけechoです...展開したいコマンドの前に置きます。これはかなり頻繁に使用します。

$ ls
one.txt
two.txt
three.dat
$ echo rm *.txt
rm one.txt two.txt
$ rm *.txt

HomeおよびDelを使用して、上記のをすばやく追加/削除できますecho

EDIT
ように指摘し(それがある場合のように、コマンドが単純なコマンドでない場合は、コメントでは、これは動作しませんforループ、パイプを使用し|、または&&またはそのような何か)。


1
これは、スクリプトをテストするときに行うことです
バーマー

これはまだ他のシェルトークンの影響を受けecho cat * | someprogramますが、この答えからあなたが考えるかもしれないことはしません。
クロルタン

13

を使用できますset -x

たとえば、スクリプトを考えてみましょう。

$ cat script.sh
set -x
echo *

実行すると、echo実際に実行する前に展開されたステートメントが表示されます。

$ bash script.sh
+ echo file1 file2 file3 script.sh
file1 file2 file3 script.sh

また、Kundorが指摘しているように、これはコマンドラインでも対話的に機能します。

$ set -x
+ set -x
$ echo *
+ echo file1 file2 file3 script.sh
file1 file2 file3 script.sh

ドキュメンテーション

man bash次のことを説明set -xします。

コマンド、ケースコマンド、選択コマンド、またはコマンドの算術演算の各単純なコマンドを展開した後、PS4の展開値を表示し、その後にコマンドとその展開引数または関連する単語リストを表示します。

のデフォルト値PS4は、上記のように、プラス記号とそれに続くスペースです。


2
そして、それは(私はOPが探していると考えている。)も、インタラクティブシェルで罰金に動作します
ニック・マッテオ

7

対話型シェルの場合は、プレスCtrl+xに続いて*拡大しているのglobパターンを使用して、コマンドラインを編集しますグロブパターンを入力した後。bashのmanページから:

glob-expand-word(C-x *

ポイントの前の単語はパス名展開のパターンとして扱われ、一致するファイル名のリストが挿入されて、単語が置き換えられます。数値引数が指定されている場合、パス名展開の前にアスタリスクが追加されます。

glob-list-expansions(Ctrl+xg)にも興味があるかもしれません。


Mac OSのbashを使用しています。ctrl + x、command + xを試しました。コマンドライン編集を行うかどうかはわかりません。もっと詳しく教えていただけますか?
ウェイシZen

@WeishiZengなぜそれがあなたのために機能しないのか分かりません。Ctrl+x, *入力後すぐに押しましたかecho *、Enterキーを押す前に?それでも動作しない場合は、~/.inputrcglob-expand-wordを変更して別のものにバインドできます。
ジェームズリン

contrl + xは、カーソルを単語echoに移動しますが、何も編集しません。「Ctrl + x、」、それはどういう意味ですか?(ctrl + xまたはctrl + ??)*はShiftにあるため、*を取得するにはShiftキーも押す必要がありますか?
ウェイシZen

右、を押しCtrl+xてからを押しShift+8ます。動作する場合は試してみるCtrl+x, gか、先ほど言ったように、.inputrcファイルに独自のキーを割り当てます。
ジェームズドリン

1

引数がどのように展開またはトークン化されるかを確認する場合は、引数を出力するプログラムまたはスクリプトを使用できます。以下に1つの実装を示しbashます。

#!/bin/bash

for (( i = 0; i <= $#; ++i )); do
    printf 'argv[%d] = %s\n' $i "${!i}"
done

というファイルにそれを入れてprintargs.sh(そしてそれを実行可能にすると)、次のような出力が得られます。

$ ./printargs.sh a{1..3}b
argv[0] = ./printargs.sh
argv[1] = a1b
argv[2] = a2b
argv[3] = a3b
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.