1. ホーム
  2. スクリプト・コラム
  3. リナックスシェル

Bashスクリプトでaliasを導入する方法

2022-02-07 04:06:46

エイリアスの使用

日々の開発では、運用・保守の効率化を図るために、コマンドに短い名前を定義するエイリアス(コマンドエイリアス)を使用しています。例えば // Create a donut //void gltMakeTorus(GLTriangleBatch& torusBatch, GLfloat majorRadius, GLfloat minorRadius, GLint numMajor, GLint numMinor); //parameter 1: GLTriangleBatch container helper class //parameter 2: outer edge radius //parameter 3: inner edge radius //parameters 4, 5: number of subdivision units for the major and minor radii gltMakeTorus(torusBatch, 1.0f, 0.3f, 52, 26); Copy the code に以下を追加します。

    GLfloat vRed[] = { 1.0f, 0.0f, 0.0f, 1.0f };

    //parameter 1: GLT_SHADER_DEFAULT_LIGHT default light shader
    //parameter 2: model view matrix
    //parameter 3: projection matrix
    //parameter 4: basic color value
    shaderManager.UseStockShader(GLT_SHADER_DEFAULT_LIGHT, transformPipeline.GetModelViewMatrix(), transformPipeline.GetProjectionMatrix GetProjectionMatrix (), vRed);
    
    torusBatch.Draw();
Copy the code

実行 //Enable surface culling (default is backside culling) glEnable(GL_CULL_FACE); //turn off surface rejection (default is backside rejection) glDisable(GL_CULL_FACE); //User can choose which face to cull :GL_FRONT,GL_BACK,GL_FRONT_AND_BACK ,default GL_BACK glCullFace(GL_BACK); // user specifies which side of the winding sequence is the front (you can specify clockwise as the front, but it is not recommended) GL_CW(clockwise) GL_CCW(counterclockwise) glFrontFace(GL_CCW); Copy the code その後、エイリアスの定義が現在のターミナル環境に読み込まれ、その定義にアクセスするために glEnable(GL_CULL_FACE); glFrontFace(GL_CCW); glCullFace(GL_BACK); //Cancel after drawing to ensure the independence of single rendering glDisable(GL_CULL_FACE); Copy the code を表示することができます。

//Enable depth testing
glEnable(GL_DEPTH_TEST);

//unable the depth test
glDisable(GL_DEPTH_TEST);
Copy the code

コマンドラインからaliasを実行しても、期待通りの効果が得られます。

    /** Enable polygon offset
     * List of parameters.
     GL_POLYGON_OFFSET_POINT : corresponds to the rasterization mode: GL_POINT
     GL_POLYGON_OFFSET_LINE : corresponds to the rasterization mode: GL_LINE
     GL_POLYGON_OFFSET_FILL : Corresponds to the rasterization mode: GL_FILL
     */
    glEnable(GL_POLYGON_OFFSET_FILL);
    
    // turn off polygon offset
    glDisable(GL_POLYGON_OFFSET_FILL);
Copy the code

Bashスクリプトでaliasを導入する際の問題点

しかし、このような場合にも void glPolygonOffset(Glfloat factor,Glfloat units); Applies the equation for calculating the total offset on a segment: Depth Offset = (DZ * factor) + (r * units); DZ: Depth value (Z value) r: the smallest value that causes the depth buffer to change Copy the code をBashスクリプトに組み込むことで、コマンドを簡略化することができます。たとえば

スクリプトファイル test.sh

    glDisable(GL_POLYGON_OFFSET_FILL);
Copy code

test.shを実行すると、エラーが表示されます。

//Enable blending
 glEnable(GL_BLEND);
Copy code

これは、BashではデフォルトでBashスクリプトにエイリアスを導入できないためで、Bashの公式ドキュメントでは、実際には Target color: the color value already stored in the color buffer Source color: The color value that enters the color buffer as the result of the current render command When blending is enabled, the way the source and destination colors are combined is controlled by the blending equation. By default By default, the blending equation looks like this: Cf = (Cs * S) + (Cd * D) Cf : the color of the final calculation parameter Cs : source color Cd : the target color S : source blending factor D :target blending factor Copy Code の代わりに // S: original blending factor D: target blending factor glBlendFunc(GLenum S,GLenum D); Copy code . そこで質問なのですが、せっかく頑張って書いたエイリアスを全部関数に変更することはできないのでしょうか?

幸いなことに、回避策があります。

解決方法

test.shに一行追加するだけです。 glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA); If the color buffer already has a color red (1.0f,0.0f,0.0f,0.0f), this is the target color Cd, and if an alpha of 0.6 blue (0.0f,0.0f,1.0f,0.6f) is used on top of this Cd (target color) = (1.0f,0.0f,0.0f,0.0f) Cs (source color) = (0.0f,0.0f,1.0f,0.6f) S = source alpha value = 0.6f D = 1 - source alpha value = 1 - 0.6f = 0.4f Mixing equation: Cf = (Cs * S) + (Cd * D) Equals = (Blue * 0.6f) + (Red * 0.4f) Copy the code

新しいスクリプトファイル

#! /bin/bash

shopt -s expand_aliases
source ~/.bash_profile
ll

実行すると、うまくいくのですが、なぜでしょうか?

$ bash test.sh 
total 48
-rw-rw-r-- 1 liyang liyang 62 Sep 16 09:38 test.c
-rw-rw-r-- 1 liyang liyang 68 Sep 16 09:38 foo.h
-rw-rw-r-- 1 liyang liyang 74 Sep 16 09:38 foo.c
-rwxrwxr-x 1 liyang liyang 8592 Sep 16 09:44 libfoo.so
-rw-rw-r-- 1 liyang liyang 4347 Sep 16 09:44 o23.s
-rwxrwxr-x 1 liyang liyang 9451 Sep 16 09:45 test
-rw-rw-r-- 1 liyang liyang 64 Mar 8 21:33 test.sh

キーは shopt -s expand_aliases フレーズ shopt は、シェルに関連する多くのスイッチを制御するために使用できるコマンドです。 expand_aliases はその一つで、これをオンにすると、Bashスクリプト内のすべてのコマンド・エイリアスが alias がすべて展開されます。

エキスパンドエイリアス
設定された場合、エイリアスは以下の「エイリアス」「エイリアス」で説明されているように展開されます。このオプションは、対話型シェルではデフォルトで有効になっています。

概要

  • aliasコマンドは、コマンド・エイリアスをカスタマイズし、操作を簡素化するのに役立ちます。
  • デフォルトでは、ターミナル環境からBashスクリプトにエイリアスを導入することはできません。
  • によって shopt -s expand_aliases を使用すると、上記の問題を解決することができます。

参考資料

https://www.gnu.org/software/bash/manual/html_node/The-Shopt-Builtin.html

Bashスクリプトでaliasを導入する方法についての説明は以上となります。Bashスクリプトにaliasを導入する方法については、スクリプトハウスの過去記事を検索するか、引き続き以下の関連記事を参照してください。