BASHプログラミング
 Computer >> コンピューター >  >> プログラミング >> BASHプログラミング

Git用の6つの便利なBashスクリプト

Gitリポジトリで作業しているときに、自分の生活を楽にする一連のBashスクリプトを作成しました。私の同僚の多くは、必要はないと言っています。私がする必要があることはすべてGitコマンドで実行できるということです。それは本当かもしれませんが、私が望むことを実行するための適切なGitコマンドを見つけようとするよりも、スクリプトの方がはるかに便利だと思います。

1。 gitlog

gitlog マスターバージョンに対して現在のパッチの簡略リストを出力します。古いものから新しいものへと印刷し、作者と説明を Hで表示します。 HEADの場合 、 ^ HEAD ^の場合 、 2 HEAD〜2の場合 などなど。例:

 $ gitlog 
----------------------- [recovery25] --------------- --------
(snip)
11 340d27a33895 Bob Peterson gfs2:ioエラー後にail2リストをドレインします
10 9b3c4e6efb10 Bob Peterson gfs2:gfs2_create_inodeのiopenglockmessをクリーンアップします
9 d2e8c22be39b Bob Peterson gfs2:go_syncファミリーのグロップに対して適切なエラーチェックを行う
8 9563e31f8bfd Christoph Hellwig gfs2:gfs2_page_mkwriteでpage_offsetを使用する
7 ebac7a38036c Christoph Hellwig gfs br /> 6 f703a3c27874 Andreas Gruenbacher gfs2:mmap書き込みとpunch_holeの一貫性を改善
5 a3e86d2ef30e Andreas Gruenbacher gfs2:gfs2_page_mkwriteでのマルチブロック割り当て
4 da3c604755b0 Andreas Gruenbacher gfs gfs2_page_mkwrite
3 4525c2f5b46f Bob PetersonRafaelAquiniのスラブインストルメンテーション
2 a06a5b7dea02 Bob Peterson GFS2:go_get_holdtimeをgl_opsに追加
^ 8ba93c796d5c Bob Peterson gfs2:新しい関数remaining_hold_timeを導入し、それをdqで使用します
H e8b5ff851bb9 Bob Peterson gfs2:rgrpsに最小保持時間を許可します

別のブランチにあるパッチを確認したい場合は、別のブランチを指定できます:

 $ gitlog recovery24 

2。 gitlog.id

gitlog.id パッチSHA1IDを出力するだけです:

 $ gitlog.id 
----------------------- [recovery25] ------------- ----------
56908eeb6940 2ca4a6b628a1 fc64ad5d99fe 02031a00a251 f6f38da7dd18 d8546e8f0023 fc3cc1f98f6b 12c3e0cb3523 76cce178b134 6fc1dce3ab9c 1b681ab074ca 26fed8de719b 802ff51a5670 49f67a512d8c f04f20193bbb 5f6afe809d23 2030521dc70e dada79b3be94 9b19a1e08161 78a035041d3e f03da011cae2 0d2b2e068fcd 2449976aa133 57dfb5e12ccd 53abedfdcf72 6fbdda3474b3 49544a547188 187032f7a63c 6f75dae23d93 95fc2a261b00 ebfb14ded191 f653ee9e414a 0e2911cb8111 73968b76e2e3 8a3e4cb5e92c a5f2da803b5b 7c9ef68388ed 71ca19d0cba8 340d27a33895 9b3c4e6efb10 d2e8c22be39b 9563e31f8bfd ebac7a38036c f703a3c27874 a3e86d2ef30e da3c604755b0 4525c2f5b46f a06a5b7de

ここでも、現在のブランチを想定していますが、必要に応じて別のブランチを指定できます。

3。 gitlog.id2

gitlog.id2 gitlog.idと同じです しかし、上部に支線はありません。これは、1つのブランチから現在のブランチまでのすべてのパッチをチェリーピッキングするのに便利です:

 $#新しいブランチを作成します
$ git branch --track origin / master
$#作成したばかりの新しいブランチをチェックします
$ git checkout Recovery26
$# `gitlog.id2recovery25`のiの古いブランチから新しいブランチへのすべてのパッチをチェリーピックします
$; do git Cherry-pick $ i; done

4。 gitlog.grep

gitlog.grep パッチのコレクション内の文字列を取得します。たとえば、バグを見つけて、関数 inode_go_syncへの参照を持つパッチを修正したい場合 、私は単にします:

 $ gitlog.grep inode_go_sync 
-----------------------[recovery25-50パッチ]--------- --------------
(snip)
11 340d27a33895 Bob Peterson gfs2:ioエラー後にail2リストをドレインします
10 9b3c4e6efb10 Bob Peterson gfs2:クリーンアップiopen glock mess in gfs2_create_inode
9 d2e8c22be39b Bob Peterson gfs2:go_sync family ofglopsの適切なエラーチェックを実行します
152:-static void inode_go_sync(struct gfs2_glock * gl)
153:+ static int inode_go_sync (struct gfs2_glock * gl)
163:@@ -296,6 +302,7 @@ static void inode_go_sync(struct gfs2_glock * gl)
8 9563e31f8bfd Christoph Hellwig gfs2:gfs2_page_mkwriteでpage_offsetを使用
7 ebac7a38036c Christoph Hellwig gfs2:gfs2_allocate_page_backingでbuffer_headsを使用しないでください
6 f703a3c27874 Andreas Gruenbacher gfs2:mmap書き込みとpunch_holeの一貫性を改善します
5 a3e86d2ef30e Andreas Gruenbacher> 4 da3c604755b0 Andreas Gruenbacher gfs2:F ixgfs2_page_mkwriteでのファイルの終わりの処理
34525c2f5b46f Bob PetersonRafaelAquiniのスラブインストルメンテーション
2a06a5b7dea02 Bob Peterson PetersonPeterson残りの機能GFS2:go_get_holdtimeをgl_opsに追加dqで使用
H e8b5ff851bb9 Bob Peterson gfs2:rgrpsに最小ホールドタイムを持たせる

これで、パッチが HEAD〜9であることがわかりました。 修正が必要なものです。 git rebase -i HEAD〜10を使用しています パッチ9を編集するには、 git commit -a --amend 、次に git rebase --continue 必要な調整を行います。

5。 gitbranchcmp3

gitbranchcmp3 現在のブランチを別のブランチと比較できるので、古いバージョンのパッチを新しいバージョンと比較して、何が変更され、何が変更されていないかをすばやく確認できます。比較スクリプト(GNOME3でも動作するKDEツールKompareを使用)を生成して、まったく同じではないパッチを比較します。行番号以外に違いがない場合は、 [SAME]と出力されます。 。コメントの違いしかない場合は、[同じ]と出力されます。 (小文字)。例:

 $ gitbranchcmp3 Recovery24 
Branchrecovery24には47個のパッチがあります
Branchrecovery25には50個のパッチがあります

(snip)
38 87eb6901607a 340d27a33895[同じ]gfs2:ail2をドレインしますioエラー後のリスト
3990fefb577a26 9b3c4e6efb10 [same] gfs2:gfs2_create_inodeのiopenglockmessをクリーンアップします
40ba3ae06b8b0e d2e8c22be39b [same] gfs2:go_syncファミリーのglopsの適切なエラーチェックを行います
9563e31f8bfd [SAME] gfs2:gfs2_page_mkwriteでpage_offsetを使用
42 0adc6d817b7a ebac7a38036c [SAME] gfs2:gfs2_allocate_page_backingでbuffer_headsを使用しない
43 55ef1f8d0be8 f703 /> 44 de57c2f72570 a3e86d2ef30e [SAME] gfs2:gfs2_page_mkwriteでのマルチブロック割り当て
45 7c5305fbd68a da3c604755b0 [SAME] gfs2:gfs2_page_mkwriteでのファイルの終わりの処理を修正
46 162524005151インストルメンテーション
47a06a5b7dea02 [] GFS2:go_getを追加します_holdtime to gl_ops
48 8ba93c796d5c [] gfs2:新しい関数remaining_hold_timeを導入し、dqで使用
49 minimum rg /> have
欠落しているもの:
次の場所で生成されたスクリプトを比較してください:/tmp/compare_mismatches.sh

6。 gitlog.find

最後に、 gitlog.findがあります 、パッチのアップストリームバージョンがどこにあるか、および各パッチの現在のステータスを識別するのに役立つスクリプト。これは、パッチの説明と一致させることによって行われます。また、現在のパッチをアップストリームのパッチと比較するための比較スクリプトを生成します(ここでもKompareを使用)。

 $ gitlog.find 
-----------------------[recovery25-50パッチ]---------- -------------
(snip)
11 340d27a33895 Bob Peterson gfs2:ioエラー後にail2リストをドレインします
lo 5bcb9be74b2a Bob Peterson gfs2:ail2をドレインしますioエラー後のリスト
109b3c4e6efb10 Bob Peterson gfs2:gfs2_create_inodeのiopenglockmessをクリーンアップします
fn2c47c1be51fb Bob Peterson gfs2:gfs2_create_inodeのiopenglockmessをクリーンアップします。 go_syncファミリーのglopsのエラーチェック
lofeb7ea639472 Bob Peterson gfs2:go_syncファミリーのglopsの適切なエラーチェックを実行します
8 9563e31f8bfd Christoph Hellwig gfs2:gfs2_page_mkwriteでpage_offsetを使用します
ms f3915f83e84c Christoph gfs2_page_mkwriteでpage_offsetを使用する
7ebac7a38036c Christoph Hellwig gfs2:gfs2_allocate_page_backingでbuffer_headsを使用しない
ms 35af80aef99b Christoph Hellwig gfs2:gfs2_allocate_page_baでbuffer_headsを使用しないcking
6 f703a3c27874 Andreas Gruenbacher gfs2:mmap書き込みとpunch_holeの一貫性を改善
fn 39c3a948ecf6 Andreas Gruenbacher gfs2:mmap書き込みとpunch_holeの一貫性を改善
5 a3e86d2ef30e Andreas Gruenbacher gfs gfs2_page_mkwrite
fn f53056c43063 Andreas Gruenbacher gfs2:gfs2_page_mkwriteでのマルチブロック割り当て
4 da3c604755b0 Andreas Gruenbacher gfs2:gfs2_page_mkwriteでのファイルの終わりの処理を修正
fn 184b4e608 -gfs2_page_mkwriteでのファイル処理
34525c2f5b46f Bob PetersonRafaelAquiniのスラブインストルメンテーション
アップストリームが見つかりません
2a06a5b7dea02 Bob Peterson GFS2:go_get_holdtimeをgl_opsに追加
アップストリームで見つかりません
H e8b5ff851bb9 Bob Peterson gfs2:rgrpsに最小ホールドタイムを許可します
見つかりませんストリーム
生成されたスクリプトの比較:/tmp/compare_upstream.sh

パッチは2行で表示されます。最初の行は現在のパッチで、その後に対応するアップストリームパッチが続き、アップストリームステータスを示す2文字の省略形が続きます。

  • lo パッチがローカルのアップストリームGitリポジトリにのみ存在することを意味します(つまり、まだアップストリームにプッシュされていません)。
  • ミリ秒 パッチがLinusTorvaldのマスターブランチにあることを意味します。
  • fn パッチが私の「次の」開発ブランチにプッシュされ、次のアップストリームマージウィンドウを対象としていることを意味します。

私のスクリプトのいくつかは、私が通常Gitでどのように作業するかに基づいて仮定を立てています。たとえば、アップストリームパッチを検索するときは、よく知られているGitツリーの場所を使用します。したがって、条件に合わせて調整または改善する必要があります。 gitlog.find スクリプトはGFS2およびDLMパッチのみを見つけるように設計されているため、GFS2開発者でない限り、関心のあるコンポーネントに合わせてスクリプトをカスタマイズすることをお勧めします。

ソースコード

これらのスクリプトのソースは次のとおりです。

1。 gitlog

#!/ bin / bash 
branch =$ 1

if test "x $ branch" =x;次に
branch =`git branch -a | grep "*" | cut -d'' -f2`
fi

patchs =0
tracking =`git rev-parse --abbrev-ref --symbolic-full-name @ {u } `

LIST =` git log --reverse --abbrev-commit --pretty =oneline $ tracking .. $ branch | cut -d'' -f1 | past -s -d'' `
for i in $ LIST; do patchs =$(echo $ patchs + 1 | bc); done

if [[$ branch =〜。*for-next。*]]
then
start =HEAD
#start =origin / for-next
else
start =origin / master
fi

tracking =`git rev-parse --abbrev -ref --symbolic-full-name @ {u} `

/ usr / bin / echo" --------------------- -["$ branch"] ----------------------- "
patchs =$(echo $ patchs-1 | bc);
for i in $ LIST; do
if [$ patchs -eq 1];次に
cnt="^"
elif [$ patchs -eq 0];次に
cnt="H"
else
if [$ patchs -lt 10];次に
cnt="$ patchs"
else
cnt ="$ patchs"
fi
fi
/ usr / bin / git show --abbrev -commit -s --pretty =format: "$ cnt%h%<|(32)%an%s%n" $ i
patchs =$(echo $ patchs-1 | bc)
完了
#gitlog --reverse --abbrev-commit --pretty =format: "%h%<|(32)%an%s" $ tracking .. $ branch
#git log- -reverse --abbrev-commit --pretty =format: "%h%<|(32)%an%s" ^ origin / master ^ linux-gfs2 / for-next $ branch

2。 gitlog.id

#!/ bin / bash 
branch =$ 1

if test "x $ branch" =x;次に
branch =`git branch -a | grep "*" | cut -d'' -f2`
fi

tracking =`git rev-parse --abbrev-ref --symbolic-full-name @ {u}`

/ usr / bin / echo "----------------------- [" $ branch "] ----------- ------------ "
git log --reverse --abbrev-commit --pretty =oneline $ tracking .. $ branch |カット-d''-f1|貼り付け-s-d''

3。 gitlog.id2

#!/ bin / bash 
branch =$ 1

if test "x $ branch" =x;次に
branch =`git branch -a | grep "*" | cut -d'' -f2`
fi

tracking =`git rev-parse --abbrev-ref --symbolic-full-name @ {u}`
git log --reverse --abbrev-commit --pretty =oneline $ tracking .. $ branch |カット-d''-f1|貼り付け-s-d''

4。 gitlog.grep

#!/ bin / bash 
param1 =$ 1
param2 =$ 2

if test "x $ param2" =x;次に
branch =`git branch -a | grep "*" | cut -d'' -f2`
string =$ param1
else
branch =$ param1
string =$ param2
fi

patch =0
tracking =`git rev-parse --abbrev-ref --symbolic-full-name @ {u}`

LIST =`git log --reverse --abbrev -commit --pretty =oneline $ tracking .. $ branch | cut -d'' -f1 | past -s -d'' `
for i in $ LIST; do patchs =$(echo $ patchs + 1 | bc); done
/ usr / bin / echo "----------------------- [ "$ branch"-"$ patchs" patchs] ----------------------- "
patchs =$(echo $ patches-1 | bc );
for i in $ LIST; do
if [$ patchs -eq 1];次に
cnt="^"
elif [$ patchs -eq 0];次に
cnt="H"
else
if [$ patchs -lt 10];次に
cnt="$ patchs"
else
cnt ="$ patchs"
fi
fi
/ usr / bin / git show --abbrev -commit -s --pretty =format: "$ cnt%h%<|(32)%an%s" $ i
/ usr / bin / git show --pretty =email --patch-with- stat $ i | grep -n "$ string"
patchs =$(echo $ patchs-1 | bc)
完了

5。 gitbranchcmp3

#!/ bin / bash 

#gitbranchcmp3 []

oldbranch =$ 1
newbranch =$ 2
script=/tmp/compare_mismatches.sh

/ usr / bin / rm -f $ script
echo "#!/ bin / bash"> $ script
/ usr / bin / chmod 755 $ script
echo "#gitbranchcmp3.shによって生成されました">> $ script
echo "#このスクリプトを実行して、不一致のパッチを比較します">> $ script
echo " ">> $ script
echo" function compare_them() ">> $ script
echo" {">> $ script
echo" git show --pretty =email --patch-with -stat \ $ 1> / tmp / gronk1 ">> $ script
echo" git show --pretty =email --patch-with-stat \ $ 2> / tmp / gronk2 ">> $ script
echo "kompare / tmp / gronk1 / tmp / gronk2">> $ script
echo "}">> $ script
echo "">> $ script

if test " x $ newbranch "=x;次に
newbranch=`git branch -a | grep "*" | cut -d'' -f2`
fi

tracking =`git rev-parse --abbrev-ref --symbolic-full-name @ {u}`

declare -a oldsha1s =( `git log --reverse --abbrev-commit --pretty =oneline $ tracking .. $ oldbranch | cut -d'' -f1 | past -s -d''`)
declare -a newsha1s =( `git log --reverse --abbrev-commit --pretty =oneline $ tracking .. $ newbranch | cut -d'' -f1 | past -s -d''`)

#echo "old:" $ oldsha1s
oldcount =$ {#oldsha1s [@]}
echo "Branch$oldbranchには$oldcountパッチがあります"
oldcount =$ (echo $ oldcount-1 | bc)
#for o in `seq 0 $ {#oldsha1s [@]}`; do
#echo -n $ {oldsha1s [$ o]} ""
#desc =`git show $ i |頭-5| tail -1 | cut -b5-`
#done

#echo "new:" $ newsha1s
newcount =$ {#newsha1s [@]}
echo "ブランチ$newbranchには$newcountパッチがあります"
newcount =$(echo $ newcount-1 | bc)
#for o in `seq 0 $ {#newsha1s [@]}`; do
#echo -n $ {newsha1s [$ o]} ""
#desc =`git show $ i |頭-5| tail -1 | cut -b5-`
#done
echo

for new in `seq 0 $ newcount`; do
newsha =$ {newsha1s [$ new]}
newdesc =`git show $ newsha |頭-5| tail -1 | cut -b5-`
oldsha =""
same ="[]"
`seq 0$oldcount`の古いもの; do
if test "$ {oldsha1s [$ old]}" ="match";次に
続行;
fi
olddesc =`git show $ {oldsha1s [$ old]} |頭-5| tail -1 | cut -b5-`
if test "$ olddesc" ="$ newdesc";次に
oldsha =$ {oldsha1s [$ old]}
#echo $ oldsha
git show $ oldsha | tail -n +2 | grep-v"index。*\。\。" | grep -v "@@"> / tmp / gronk1
git show $ newsha | tail -n +2 | grep-v"index。*\。\。" | grep -v "@@"> / tmp / gronk2
diff / tmp / gronk1 / tmp / gronk2&> / dev / null
if [$? -eq 0]; then
#違いなし
same ="[SAME]"
oldsha1s [$ old] ="match"
break
> git show $ oldsha | sed -n'/ diff /、$ p'| grep-v"index。*\。\。" | grep -v "@@"> / tmp / gronk1
git show $ newsha | sed -n'/ diff /、$ p'| grep-v"index。*\。\。" | grep -v "@@"> / tmp / gronk2
diff / tmp / gronk1 / tmp / gronk2&> / dev / null
if [$? -eq 0]; then
#コメントのみの違い
same ="[same]"
oldsha1s [$ old] ="match"
break
oldsha1s [$ old] ="match"
echo "compare_them $ oldsha $ newsha">> $ script
fi
done
echo "$ new $ oldsha $ newsha $ same $ newdesc "
done

echo
echo" $ newbranchから欠落しています: "
the_missing =" "
#今、私たちの古いものを実行します`seq 0$oldcount`の古いものと
一致していません。 do
if test $ {oldsha1s [$ old]}!="match";次に
olddesc=`git show $ {oldsha1s [$ old]} |頭-5| tail -1 | cut -b5-`
echo "$ {oldsha1s [$ old]} $ olddesc"
the_missing =`echo" $ the_missing $ {oldsha1s [$ old]} "`
fi
done

echo "行方不明:" $ the_missing
echo "次の場所で生成されたスクリプトを比較:$ script"
#git log --reverse --abbrev -commit --pretty =oneline $ tracking .. $ branch |カット-d''-f1|貼り付け-s-d''

6。 gitlog.find

#!/ bin / bash 

#アップストリームの同等のパッチを見つける

#gitlog.find

cwd =$ PWD
param1 =$ 1
ubranch =$ 2
patchs =0
script =/tmp/compare_upstream.sh
echo "#!/ bin / bash"> $ script
/ usr / bin / chmod 755 $ script
echo "#gitbranchcmp3.shによって生成されました">> $ script
echo "#このスクリプトを実行して、不一致のパッチを比較します">> $ script
echo "">> $ script
echo "function compare_them()">> $ script
echo "{">> $ script
echo "cwd =$ PWD">> $ script
echo "git show --pretty =email --patch-with-stat \ $ 2> / tmp / gronk2">> $ script
echo "cd〜/ linux.git / fs / gfs2 ">> $ script
echo" git show --pretty =email --patch-with-stat \ $ 1> / tmp / gronk1 ">> $ script
echo" cd $ cwd ">> $ script
echo "kompare / tmp / gronk1 / tmp / gronk2">> $ script
echo "}">> $ script
echo "">> $ script

#echo"アップストリームパッチ情報を収集しています。お待ちください。"
branch =`git branch -a | grep "*" | cut -d'' -f2`
tracking =`git rev-parse --abbrev-ref --symbolic-full-name @ {u}`

cd〜/ linux.git
if test "X $ {ubranch}" ="X";次に
ubranch=`git branch -a | grep "*" | cut -d'' -f2`
fi
utracking =`git rev-parse --abbrev-ref --symbolic-full-name @ {u}`

#見つからない場合に備えて、マスターからgfs2パッチのリストを収集します

#git log --abbrev-commit --pretty =format: "%h%<|(32) %an%s "master | grep -i -e" gfs2 "-e" dlm "> / tmp / gronk
git log --reverse --abbrev-commit --pretty =format:" ms%h% <|(32)%an%s "master fs / gfs2 /> /tmp/gronk.gfs2
#ms=Linusのマスター
gitlog --reverse --abbrev-commit --pretty =形式: "ms%h%<|(32)%an%s" master fs / dlm /> /tmp/gronk.dlm

cd $ cwd
LIST =`git log- -reverse --abbrev-commit --pretty =oneline $ tracking .. $ branch | cut -d'' -f1 | past -s -d'' `
for i in $ LIST; do patchs =$(echo $ patchs + 1 | bc); done
/ usr / bin / echo "----------------------- [ "$ branch"-"$ patchs" patchs] ----------------------- "
patchs =$(echo $ patches-1 | bc );
for i in $ LIST; do
if [$ patchs -eq 1];次に
cnt="^"
elif [$ patchs -eq 0];次に
cnt="H"
else
if [$ patchs -lt 10];次に
cnt="$ patchs"
else
cnt ="$ patchs"
fi
fi
/ usr / bin / git show --abbrev -commit -s --pretty =format: "$ cnt%h%<|(32)%an%s" $ i
desc =`/ usr / bin / git show --abbrev-commit -s- -pretty =format: "%s" $ i`
cd〜/ linux.git
cmp =1
up_eq =`git log --reverse --abbrev-commit --pretty =形式: "lo%h%<|(32)%an%s" $ utracking .. $ ubranch | grep "$ desc" `
#lo =in local for-next
if test" X $ up_eq "=" X ";次に
up_eq=`git log --reverse --abbrev-commit --pretty =format:" fn%h%<|(32)%an%s "master .. $ utracking | grep "$ desc" `
#fn =in for-next for next merge window
if test" X $ up_eq "=" X ";次に
up_eq=`grep" $ desc "/tmp/gronk.gfs2`
if test" X $ up_eq "=" X ";次に
up_eq=`grep" $ desc "/tmp/gronk.dlm`
if test" X $ up_eq "=" X ";次に
up_eq="アップストリームが見つかりません"
cmp =0

fi
fi
if [$ cmp -eq 1];次に
UP_SHA1=`echo $ up_eq | cut -d'' -f2`
echo" compare_them $ UP_SHA1 $ i ">> $ script
fi
cd $ cwd
patchs =$(echo $ patches-1 | bc)
done
echo "生成されたスクリプトの比較:$ script"


  1. Bash-it –スクリプトとエイリアスを制御するためのBashフレームワーク

    Bash-it は、 Bash 3.2+用のコミュニティBashコマンドとスクリプトのバンドルです。 、オートコンプリート、テーマ、エイリアス、カスタム関数などが付属しています。日常業務用のシェルスクリプトとカスタムコマンドを開発、保守、使用するための便利なフレームワークを提供します。 日常的にBashシェルを使用していて、すべてのスクリプト、エイリアス、関数を追跡する簡単な方法を探している場合は、 Bash-it あなたのためです! 〜/ binの汚染をやめましょう ディレクトリと.bashrc ファイル、フォーク/クローンBash-それをハッキングし始めます。 LinuxにBash-

  2. Linuxで効果的なBashスクリプトを作成するための10の便利なヒント

    シェルスクリプトは、Linuxで学習/実行できるプログラミングの最も簡単な形式です。さらに言えば、タスクを自動化し、ほんの数例を挙げると、新しいシンプルなユーティリティ/ツールを開発するためのシステム管理に必要なスキルです。 この記事では、効果的で信頼性の高いbashスクリプトを作成するための10の便利で実用的なヒントを紹介します。これらには、次のものが含まれます。 1。スクリプトでは常にコメントを使用する これは、シェルスクリプトだけでなく、他のすべての種類のプログラミングにも適用される推奨される方法です。スクリプトにコメントを書くと、あなたや他の誰かがスクリプトを読んで、スクリプトのさ