デフォルトの.bashrcでeval式を説明できますか


2

私は中/etc/skel/.bashrcを見ていましたが、この行を見つけました:

[ -x /usr/bin/lesspipe ] && eval "$(SHELL=/bin/sh lesspipe)"

私はテスト-xが何をするのか理解していますが、それ以降のすべてevalは理解できません。

さらに、他のLinuxディストリビューションでこの行を実行すると、エラーが発生します。

#  eval "$(SHELL=/bin/bash lesspipe)"
bash: syntax error near unexpected token `newline'

これはUbuntu 14.04(bash 4.3.11(1))にあり、テストした他のbashバージョンは4.3.39(1)です。

この行が何をしているのか、そしてなぜ上記のエラーが発生するのか説明できますか?

回答:


1

evalスニペットを理解するにはeval "$(SHELL=/bin/sh lesspipe)"、分解する必要があります。

  • 最初に何SHELL=/bin/sh lesspipeが返されるかを確認しましょう:

    $ SHELL=/bin/sh lesspipe
    export LESSOPEN="| /usr/bin/lesspipe %s";
    export LESSCLOSE="/usr/bin/lesspipe %s %s";

    ご覧のとおり、export環境変数にする前に変数宣言を含む2つのコマンドを返します。

  • もう1つ$()は、上で見たもの、つまりコマンドの出力を正確に返すコマンド置換構文です。チェックしてみましょう。

    $ echo "$(SHELL=/bin/sh lesspipe)"
    export LESSOPEN="| /usr/bin/lesspipe %s";
    export LESSCLOSE="/usr/bin/lesspipe %s %s";
  • では、eval今はどうでしょうか。evalコマンド置換によって返される2つのコマンドを実行するだけです。

    eval "$(SHELL=/bin/sh lesspipe)"

    この後、変数はLESSOPENLESSCLOSEこのコマンドが実行されているシェルの環境変数になります。


わかりました、これはまだエラーを説明しません。私はあなたの最初のステップを行う際にさらにより多くの、私はあなたの言うことを取得/ binに/ SH(ダッシュ)ではなくbashのと...と
Oz123

@ Oz123のlessfileスクリプトが付属していますless中にエラーを再現することはできません..私dashkshbashzsh..On覗きずに言うのは難しい...これは、異なるコース振る舞うことができる他のシステム、
heemayl

lesspipegentooにパッケージ化されたless-481に付属するものは、Ubuntuに付属するもの(458-2未満)とは大幅に異なることがすでにわかっています。gentooからのものはここにありますgitweb.gentoo.org/repo/gentoo.git/tree/sys-apps/less/files/…、そしてこれもありますlesspipe.sh。図を見て、私はいつも私のbashrcは普遍的だと思っていました。どうやらそれは...ではありません
Oz123
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.