webdevqa.jp.net

新しいソフトウェアをインストールする前にエコーを使用するのはなぜですか?

コンピューティングの世界は初めてです。 ROS Indigoのインストール中、最初のステップで次のコードを使用するように指示されます。

Sudo sh -c 'echo "deb http://packages.ros.org/ros/ubuntu $(lsb_release -sc) main" > /etc/apt/sources.list.d/ros-latest.list'

このコンテキストでechoコマンドをsh -cと一緒に使用するのはなぜですか?他のインストールプロセスでもechoコマンドが使用されるのを見てきました。

注- shコマンドの使用ROS Indigo Installation Wiki

25
Pallav Bakshi

通常、echoコマンドの機能は、コンソールに文字列(テキストの一部)を表示することです。しかし今回は、echoコマンドの後に_>_文字が追加され、その出力がテキストファイル_/etc/apt/sources.list.d/ros-latest.list_にリダイレクトされます。

したがって、基本的に、このコマンド全体がテキストファイルにテキストの一部を書き込みます。さて、ここでトリッキーな部分があります:

ファイルに書き込まれる文字列は、コンピューターごとに異なる場合があります。 echoコマンドを実行すると、$(lsb_release -sc)の部分が解決されます(別のものに変更されます)。

コマンドの前後にテキストエディターで_/etc/apt/sources.list.d/ros-latest.list_を開いて、変更を確認できます。 (このコマンドの前にファイルが存在しない可能性があります。)

43
user477799

パッケージ管理とソフトウェアリポジトリ

DebianベースのLinuxディストリビューションは、リポジトリ(アプリケーションインストールパッケージとアップグレードパッケージのデータベース)に依存して、オペレーティングシステムを最新の状態に保ち、新しいソフトウェアパッケージを簡単にフェッチしてインストールします。これらのリポジトリの場所は/etc/apt/sources.listに保存されますが、通常は特定のアプリケーションに固有の追加のソースを/etc/apt/sources.list.dディレクトリに保存できます。

パッケージインデックス更新コマンドapt-get updateが実行されると、オペレーティングシステムはこれらのパッケージリポジトリで使用可能なパッケージを確認し、オペレーティングシステムで使用可能なソフトウェアを登録して、従来のapt-get install <package>コマンドを使用してインストールを続行できます。

これらのソフトウェアソースの例は次のとおりです。

deb http://us-west-2.ec2.archive.ubuntu.com/ubuntu/ trusty main restricted

これらのソースがLinuxディストリビューションの特定のバージョンを参照することが重要です。例は、Ubuntu 14.04のコード名であるtrustyです。 lsb_release -aまたはlsb_release -scを使用して、OS(debianベース)に完全な詳細を照会できます。つまり、shortおよびcodename

あなたの質問では、$(lsb_release -sc)という部分が解釈され、オペレーティングシステムからの結果はprintedされてカスタムソースファイルros-になります。コマンドが実行時に作成するlatest.list


コマンド言語インタープリター

shコマンドは ボーンシェル です。これはいくつかのシェルの1つですが、古い標準と見なされており、通常は存在することが確実なものです。多くのシェルスクリプトでbashを参照することも一般的です。その宣言は、異なるシェルが異なる構文を使用するので、使用するシェルを指定しています。

-cフラグについては、man bashを引用します。

-cオプションが存在する場合、コマンドは文字列から読み取られます。文字列の後に引数がある場合、それらは$ 0から始まる定位置パラメーターに割り当てられます。

''内のすべてが文字列として読み取られます。さまざまな引用符をエスケープする方法を理解したり、シェルが何かを間違った方法で解釈することを心配する必要はありません。


tl; dr

このコマンドは、deb http://packages.ros.org/ros/ubuntu $(lsb_release -sc) mainをカスタムソースファイルに出力し、$(lsb_release -sc)を解釈された値に置き換えます。

2
Ralph