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


25

コンピューティングの世界は初めてです。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'

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

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


回答:


43

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

したがって、基本的に、このコマンド全体がテキストをテキストファイルに書き込みます。さて、ここからが難しい部分です。

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

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


19
実際には>、テキストファイルを上書き>>し、最後に追加します。
-dirkt

3
@dirktありがとう。私の悪い!;)これは、いくつかのスクリプト言語を学習した結果です。矛盾する行動は、最終的にあなたを悩ませるようになります。DOSでも、>は上書きされます。

10
echoコンソールではなく、標準出力に書き込みます。
マイケルハンプトン

4
「リダイレクトされない限り、標準出力はプログラムを開始したテキスト端末です。」そのため、はい、echoコンソールに書き込みます。

2

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

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

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

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

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

これらのソースは、Linuxディストリビューションの特定のバージョンを参照することが重要です。例は、Ubuntu 14.04のコードネームであるtrustyです。あなたはとの完全な詳細については、お使いのOS(のdebianベース)を照会することができるlsb_release -alsb_release -scを意味している短いコードネーム

質問では、パーツ$(lsb_release -sc)が解釈れ、オペレーティングシステムからの結果がカスタムソースファイルros-latest.listに出力され、コマンドが実行時に作成されます。


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

shコマンドはBourneシェル。これは、いくつかのシェルのうちの1つですが、古い標準と見なされており、一般に存在することを確認できます。またbash、多くのシェルスクリプトでよく見られます。その宣言は、異なるシェルが異なる構文を使用するため、使用するシェルを指定しています。

-cフラグに関しては、引用してman bashください:

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

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


tl; dr

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

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