2016-08-23 4 views
0

シーンを設定するには、自分の/.bash_profileを編集していて、現在のディレクトリとPS1内のディレクトリにあるファイルが必要でした。それは動作しますが、私は間隔で奇妙なエラーを取得しています:これはと、ある理由私は理解していない変数を使用してコマンドを呼び出すときに空白エラーが発生しました

(~) (  12) 

- 私の知識に - コードはその空白を加えるべきではありません。

lines=$(ls | wc -l) 
PS1='\n\e[2m(\w) ($lines)\e[22m\n> ' 

私はこれが起こっている理由としては考えている、といくつかのバッシュの魔法を持つ人には便利だろう。

答えて

2

PS1は、少なくともどのように使用されているかにかかわらず、ほとんどの変数と少し異なります。そのプロンプトと出力をecho "$PS1"と比較すると分かりやすいように、プロンプトを表示するには、その値が単純に標準エラーに出力されるわけではありません。

プロンプトが最後に表示されたときに$linesの値の先頭の空白が$linesのクォートされていない拡張から削除されないことがわかるので、評価ルールは通常の評価ルールと同じではありません。

PS1='\n\e[2m(\w) ($(echo $lines))\e[22m\n> ' 

ベター:この問題を回避するために

一つの方法は、が、その後プロンプトで使用するために、そのコマンドの出力をキャプチャし、通常の評価を受けないことをシェルコマンドでプレーンなパラメータ展開を交換することですまだ、lsの出力を解析していない:あなたが前各linesの値をリセットされない限り、

また
PS1='\n\e[2m(\w) ($(f=(*); echo ${#f[@]}))\e[22m\n> ' 

(、:アレイと出力の長さを作成しますプロンプトでPROMPT_COMMANDと入力すると、linesが設定されているディレクトリ(おそらくあなたのホームディレクトリ)にあったディレクトリのファイル数が表示されます。ファイル数がの場合はとなります。プロンプト自体は現在のディレクトリのファイル数を取得します。

+0

ありがとうございました。あなたの2番目の、そして私が最初にコードの例が働いたと仮定して、私は変数を除外し、学習の目標のために可読性を維持するために "ls | wc -l | xargs"を印刷しました。 –

+1

本当に、 'ls | wc -l'。いずれかのファイル名に改行が含まれている場合は、それを超えてカウントされます。あなたの目標が学ぶことであるならば、間違ったやり方があなたに非常にまれにしか役に立たない場合であっても、正しいやり方をすることを学んでください。 – chepner

+0

それを指摘してくれてありがとう、私はその問題を認識していませんでした。 –

関連する問題