コマンド&コマンドラインの四つの要素は、Java&フォーク子プロセスでJavaプログラムをコンパイルして実行します

コマンドライン履歴やジャンル:

  • UNIXファミリー
    • POSIX標準
    • マックOS
    • Linuxの
    • Linux用のWindowsサブシステム
  • ウィンドウズ

コマンドの最初の4つの要素

四つの要素が不可欠コマンドで構成され、次の4つの要素が⼀コマンドを「復活」と完全に同一であることができ、あなたが遭遇した奇妙な様々な問題は、与えられた理由は、⼀四つの要素の⼀です。

  • 実行可能ファイル(実行可能)
  • パラメータ
  • 環境変数(環境変数)
  • 作業ディレクトリ(作業ディレクトリ)

1.作業ディレクトリ

カーソルの指令電流経路を開始し、相対パスは、このパスに対して相対的なものです。入力しpwd、現在の作業ディレクトリが配置されて表示するコマンドを。
理解することができます:コマンド(実行ファイル)自体は、ディレクトリ内に存在している、あなたがコマンドを実行するコマンドを見つける必要があり、通常は応じてPATH(実行可能な環境変数を見つけるために、または直接コマンドの絶対パスを使用して使用してwhichビューを)、ツールは現在、ワーキングタイトル[ディレクトリ]は、現在の職場のツールでありながら、彼はツールから来てどこで作業場所に注意を払う気にしない、これを取得します。

2.環境変数

変数は、ローカル変数および環境、環境のグローバル変数および環境変数が強く結合さに分割され、アプリケーションの広い範囲を転送するように構成され、環境変数は、例えば、異なるプログラムおよび構成にパラメータを渡すために使用されてもよいCLASSPATH、とGOPATH
すべての環境変数を参照してくださいexport

ローカル変数

それらを作成するシェルで定義されたローカル変数のスコープ。子供が継承する行かないことを意味しています。地元の機能は、ローカル変数を作成するために使用されるが、関数内でのみ使用することができます。これは、組み込み関数はセットを宣言すると、単純な名前または変数セットによって指定されたローカル変数の値であってもよいし、省略されてもよいです。

name=yue
echo $name
環境変数(グローバル変数)

また、ローカル変数と区別するために、グローバル変数として知られている環境変数は、一般的に、環境変数は、環境変数が既に使用している、大文字する必要があるexport組み込みコマンド輸出に変数を。
一時的な環境変数をexport使用すると、シェルを閉じたときに、コマンドラインに直接宣言、変数は失敗します。

export NAME=yue
echo $NAME # yue

永久(現在のユーザーの有効な永久)に必要であるexportスタートアップコンフィギュレーションファイルに書き込まれたコマンド~/.bash_profile、上記の構文は次のとおり。あなたが現在のシェルに反映したい場合は、ファイルを保存した後、すぐに実行source .bash_profile、効果を取るためにそれ以外の場合は、新しく開いたシェルを。
一時的または永続的な環境変数かどうかは、サブシェルは、現在の環境変数親シェルを継承しますが、パスを逆にすることはできませんあなたは実行するために行くことができるbashテストするサブシェルを作成します。

あなたもすぐに環境変数(現在有効なコマンドを実行するだけで、この行を)渡すことができます。

NAME=Tony go run main.go
#之后这个环境变量就不存在了
echo $NAME # 空空如也
システム変数

あなたは、WindowsにインストールされているJava開発環境であれば、あなたはPATHがこれを言及するとき、パスを必要とし、対応する実行可能ファイルを見つけて、それを実行するように、システムのPATH環境変数を設定するには、覚えておく必要があります。
ようにPATH、環境変数、システム・レベル、gitのはbashよりも~/.bash_profile広いのbashのターミナル段階でスコープ環境変数、結局、オペレーティング・システムは、お父さんです。
私はそれは非常にシンプルであることを証明したい、名前などのシステム環境変数を設定するために行くJUST_TESTエコーを実行し、その後、CMDを開くために+ Rを獲得%JUST_TEST%、あなただけの変数の値を設定するを参照してくださいすることができます。

プロセス(プロセス)

それは排他的に独自のメモリ空間とリソース、および環境変数のセットにバインドされた各プロセスをファイル実行しているコンピュータプログラムの最小単位です。子プロセスが子プロセスに継承することができ、親プロセスによってフォークうち、環境変数(グローバル変数)で、すべてのオペレーティングシステムやプログラミング言語は環境変数をサポートしています。
現在のシェル環境変数が設定され、例えばXXX、ノードは、現在の環境での実行環境に移行する、ことができるprocess.env.XXX環境変数を確認するために(上述したように、ローカル変数は子プロセスによって継承されない)継承します。

3.実行可能プログラム

何が実行可能なプログラムとしてカウント

Windowsでは、exe/bat/comファイル拡張子がパスで実行可能であるとみなされ、
UNIX / Linuxの見x特権(ls -l)、あなたは実行許可をすることができます。

どこ⾥プログラムを見つけるには?

WindowsのPATH環境変数に、現在のディレクトリであり、
UNIX / LinuxのPATH環境変数に。
実行可能ファイルがパスからパスを探している空の文字列に設定されている場合、それは検出されません。
UNIXシステム用の実行可能プログラムでは、現在のディレクトリができた場合は./xxx、実行.カレントディレクトリに代わって。
Windowsの場合、直接接尾辞として、実行可能プログラムの名前を入力してCMD、プラス何もせずに、自動的に見つけるexe/bat/comように接尾辞を。

最初のフレームにインタプリタ行(shebang)を指定します⾏スクリプト

編集xxx.sh時のファイルを、あなたは、シェルスクリプトインタプリタの別の最初の行を指定することができます。

#!/usr/bin/env node
console.log(123)

これは、現在の実行コンテキストを示し、現在のスクリプトを説明するためのノードで実行可能なプログラムを探し、そしてもちろんそれは、コマンドラインから直接実行すること、実際に書くことと等価であるノード・パス環境変数からのパスを見つけますnode xxx.sh

エイリアス(別名)

〜/ .bash_profileのインタラクティブ、ログイン操作モードはbashに
〜/ .bashrcのインタラクティブモード非ログインbashの実行中に
.bash_profileのたびにユーザーログインを読み込まれ、すべてのコマンドは、bashの内部で実行されます。
bashシェルで別のbashシェルを呼び出し、つまり、その後、あなたが新しいシェルを起動するときに、ファイルを読み込みますシェルbashでコマンドを入力し、ファイルを.bashrcに読んだとき。これは、効果的に必要なログインとサブシェル環境を隔離することができます。
一般ユーザー環境を統一するために、.bashrcの設定の.bash_profileスクリプトを呼び出します。

シェルを使用してalias、現在、ローカル変数に属する、aliasコマンドセットこの層の書かれたアクティブシェル環境、~/.bash_profileそれぞれの新しいログインシェルの後には読みますが、理由のaliasエイリアスの設定ローカル変数に所属し、プラスあなたが子供を作成するときにシェルを読み取らない.bash_profile(書かれていない限り.bashrcでは)ので、サブシェルのエイリアスを設定していないでしょう。

vim ~/.bash_profile

# 写入如下内容,保存后 source 一下立即生效

export NAME=Tony
export AGE=25

echo '你好哇~'

alias ~='cd ~'
alias cdproject='cd ~/Projects'

あなたは、端末を開くたびにログインし、あなたが表示されます你好哇~、各ターミナルを開いた後、この説明は、システムが新しいフォーク端子のbashプロセスと同等であることをシステム環境変数を継承するだけでなく、起動ファイルを実行し、それがあります.bash_profile

Linuxファイルパーミッション

Linuxの基礎 - 著作権管理chmodコマンド

4.パラメータ

これはすべての実行可能プログラムのパラメータの後ろにあります。(Javaは厳密に準拠していない)は、以下のUNIXシステムの規則として:
:1ということに同意し-、背後にある唯一の文字ではなく、組み合わせることが可能ls -althと等価ls -a -l -t -h
大会II:--単語が続くls --allと同等ls -a

パラメータスペース場合は、スペースが実行可能プログラムに渡された複数に分割されます。
引用符またはなしのパラメータ" "は二重引用符は、コマンドラインパラメータは、変数を置き換えると展開されます。
使用して' '、単一引用符を、コマンドラインは特別何もしません処理は、このパラメータは、全体を宣言するために使用されます。

export A=123
echo wan$A.m    # wan123.m
echo "wan$A.m"  # wan123.m
echo 'wan$A.m'  # wan$A.m

パラメータは、単一引用符が含まれる場合は' '、その後、二重引用符は、その後も" "ラップやエスケープ:

echo \'I am a boy\'   # 'I am a boy'
echo "'I am a boy'"   # 'I am a boy'

第二に、Javaプログラムをコンパイルして実行するコマンドを使用します

コマンドラインのステッチ:すべてのツールが一つだけあるJavaの世界

1.コンパイルと実行

javac Main.java # 源文件编译成字节码
ls # 查看编译结果 Main.class Mian.java
java Main # 运行

Javaでは:
System.getenv()View環境変数は、
System.getProperty()システムのプロパティを参照
するには、配信システムのプロパティDで始まるをであれば、我々は、書き込み位置に注意を払う必要がMianバックになったMainパラメータ、つまり、始業式は、Javaに暴露されたmianメソッドのString[] argsパラメータ。呼ばれるパスAAA、値123の特性:

java -DAAA=123 Main

user.dir現在の作業ディレクトリを表示し
java.version、現在のバージョンのJDKを表示します

2. -classpath(-cp)パラメータ

import junit.extensions.ActiveTestSuite;
public class Main {
        public static void main(String[] args) {
                System.out.println(ActiveTestSuite.class.getName());
        }
}

直接実行がjavac Main.javaエラーを見つけることができません。
だから、サードパーティのライブラリの導入のため、コンパイル時に使用-classpath(現在の作業ディレクトリに、このjarファイルのパッケージを想定して)検索パスのjarパッケージを指定するには:

javac -cp junit-3.8.2.jar Main.java

ジャーパッケージはクラスファイルに沿って束を入れ、通常のzipファイルであるため、正常、コンパイル。完全修飾クラス名(FQCNの)パッケージ名とフォルダクラスが一から一です。
これは、コマンドjavacのすべてのパラメータが続く実行可能実行可能なプログラム、である-classpath(-cp)ジャーパッケージパスを指定したが、Main.javaファイルをコンパイルされようとしています。Main.javaありActiveTestSuite、このクラスは確かにそれを見つけるために行くために空から落ちることができない、あなただけに行くことができます-cp見つけるために指定された場所。

そのまま使用するのjava陥没穴がUNIX環境とWindows環境では、そこにある実行するためのコマンドは、UNIX環境で言って、異なります。

java -cp junit-3.8.2.jar:. Main

コロンは、:パス、区切られ.た代表だけでなく、現在のディレクトリ検索では、第二javaのコマンドMain代表からJVMを告げMain、その後、プログラムを起動するクラスMainのクラスはそれを見つけるためにどこ?以下からのみ-cp(すなわち指定されたパスを探して.、現在のディレクトリを表します)、JVMは、実行Main時発見参照のActiveTestSuite継続、クラスを-cp指定されたパスを見つけること。

コマンド上記陥没穴、Windowsの実行者に文句を言うのgit bashの実行があります。一見のgit bashでコマンドを実行しますが、が、-cp背後にあるか、パスはWindows版に引き渡されるjava解決するために実行可能なプログラム、およびWindows版のクラスパスのパスセパレータは、セミコロンを使用することです;コロンの代わりに:、しかし、もしあなただけでコロンUNIX環境は(何ではbashを実行するコマンドを区切るためにセミコロンを使用しますので、セミコロンで置き換えるかをmkdir testDir; cd testDir単一引用符で結合することがそう、知っしよう)' 'であるとして、path引数は、任意のパラメータ解析を行うことはありませんを示すために、Javaコマンド。

java -cp 'junit-3.8.2.jar;.' Main

三、子プロセスにおけるJavaのフォーク

Javaのフォーク・プロセス/作業ディレクトリ/ run.sh:

#!/usr/bin/env sh
echo "AAA is: $AAA"
ls -alth

Javaのフォーク・プロセス/ Fork.java:

import java.io.File;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.Map;

public class Fork {
    public static void main(String[] args) throws Exception {
        // 使用Java代码fork一个子进程,将fork的子进程的标准输出重定向到指定文件:工作目录下名为output.txt的文件
        // 工作目录是项目目录下的working-directory目录(可以用getWorkingDir()方法得到这个目录对应的File对象)
        // 传递的命令是sh run.sh 假设working-directory目录下存在 run.sh 脚本文件
        // 环境变量是AAA=123

        // 1.可执行程序 2.参数
        ProcessBuilder pb = new ProcessBuilder("sh", "run.sh");
        // 3.工作目录
        pb.directory(getWorkingDir());
        // 4.环境变量
        Map<String, String> env = pb.environment();
        env.put("AAA", "123");
        env.get("AAA");
        pb.redirectOutput(getOutputFile());
        pb.start().waitFor();
    }

    private static File getWorkingDir() {
        Path projectDir = Paths.get(System.getProperty("user.dir"));
        return projectDir.resolve("working-directory").toFile();
    }

    private static File getOutputFile() {
        return new File(getWorkingDir(), "output.txt");
    }
}

参考:

  1. 概要Linuxのローカル変数、グローバル変数、シェル変数
  2. Linuxの基礎 - 著作権管理chmodコマンド
  3. 「Linuxのコマンドライン百科事典」

おすすめ

転載: www.cnblogs.com/nicholaswang/p/11464784.html