話題の対話型AIのChatGPT、みなさんは体験してみましたか?
時々使用している複数のフォルダを外付けHDDにバックアップする長いコマンドをシェルスクリプトにして、簡単な手順で実行できるようにしたいと思い、話題のChatGPTを使ってみました。
そして、ほとんどおまかせでシェルスクリプトを作ってもらい、具体的な使い方まで教えてもらいましたので、その内容と、質問する時のコツを紹介したいと思います。
Linuxを使い初めて7年たちましたが、シェルスクリプトについては概要を最近知った程度で、作り方や具体的な使い方も分かっていなかったのに、ChatGPTのおかげでシェルスクリプトが1つ使えるようになりました。
たったひとつのシェルスクリプトを作るのに膨大な時間をかけて勉強して、四苦八苦してシェルスクリプトを組んだりするのはコスパが悪いですよね。
勉強はしたくないけどシェルスクリプトは使いたいと考えている方は、この記事を参考にしてみてください。
シェルスクリプトについて、どこまで知ってる?
Linux歴7年ですが、普段使いしているだけではシェルスクリプトなんて使うことは無く、ほとんど知りません。
「Linux標準教科書」の勉強をいくつか記事にしていますが、6章が終わったところで勉強自体も中断してしまい、9章のシェルスクリプトまで到達していません。
そんな私がシェルスクリプトについて知っていることは、
・Linuxコマンドを利用した簡単なプログラムのこと
・自作も可能
・拡張子が.shのテキストファイルであること
・.shファイルのあるディレクトリでターミナルを使って実行可能
・どのディレクトリにいても実行できるようにするには設定が必要
・指定したタイミングや定期的に実行させることも可能
ぐらいで、作り方とか具体的な使い方はまったく知りません。
しかし、ChatGPTを利用すればシェルスクリプトを作ってくれて、具体的な使い方も教えてもらえるのではないかと考え、やってみました。
ChatGPTにLinuxのシェルスクリプトを作ってもらう
ChatGPTを利用する際には、色々と質問やお願いを文章にして入力します。
冒頭に紹介しました通り、時々使用している複数のフォルダを外付けHDDにバックアップする長いコマンドをシェルスクリプトにしたいので、まず最初に以下の文章を入力してみました。
以下のコマンドを元に、Linuxのシェルスクリプトを作成してください。
rsync -auv –delete /home/■■■■■/Documents /media/■■■■■/●●●●●/bkd && rsync -auv –delete /home/■■■■■/Downloads /media/■■■■■/●●●●●/bkd && rsync -auv –delete /home/■■■■■/Music /media/■■■■■/●●●●●/bkd && rsync -auv –delete /home/■■■■■/Pictures /media/■■■■■/●●●●●/bkd && rsync -auv –delete /home/■■■■■/Videos /media/■■■■■/●●●●●/bkd
実際は「■■■■■」にはユーザーIDが、「●●●●●」にはUSB接続した機器情報が入っています。
普段はこのコマンドをテキストファイルに保存しておき、使いたい時にターミナル(端末)にコピペして使っているのですが、これをシェルスクリプトで簡単に実行できるようにしようという訳です。
ChatGPTが作成したシェルスクリプトは以下の通り。
#!/bin/bash
rsync -auv --delete /home/■■■■■/Documents /media/■■■■■/●●●●●/bkd
rsync -auv --delete /home/■■■■■/Downloads /media/■■■■■/●●●●●/bkd
rsync -auv --delete /home/■■■■■/Music /media/■■■■■/●●●●●/bkd
rsync -auv --delete /home/■■■■■/Pictures /media/■■■■■/●●●●●/bkd
rsync -auv --delete /home/■■■■■/Videos /media/■■■■■/●●●●●/bkd
その下には、以下の説明も表示されていました。
このスクリプトは、Bashシェルで実行されることを想定しています。スクリプトの冒頭に#!/bin/bashというシバン (shebang) 行があり、これはスクリプトを実行するためのシェルのパスを指定しています。
このスクリプトは、rsyncコマンドを使用して、5つのディレクトリを同期します。各rsyncコマンドは、 -auv –deleteのオプションを指定しています。これらのオプションは、更新されたファイルのみを同期するようにし、同期元に存在しないファイルを同期先から削除するようにします。
このスクリプトは、1つずつ各ディレクトリを同期しています。したがって、実行には時間がかかる場合があります。各rsyncコマンドをバックグラウンドで実行することで、同期を同時に実行することもできますが、同期先が同じ場合に競合する可能性がありますので、注意が必要です。
要するに、コマンドさえちゃんと組んであれば1行目に「#!/bin/bash」と入力するだけでシェルスクリプトとして機能するということですね。
勉強になりました。
説明の後半は、このシェルスクリプトがどのように動作するかを自分で設定したrsyncコマンドのオプションの機能も含めての説明と、注意点も表示されています。
とても親切な回答です。
試しに作動させてみたところ、正常に作動しました。
(シェルスクリプトはただファイルに先ほどのコードを保存しても、権限の設定をしないと作動しません。設定の方法はあとで説明します。)
これをこのまま使ってもいいのですが、それでは味気ないので、各ディレクトリのバックアップがうまくいったかどうか最後に表示する機能を追加したいと思い、つづけて入力欄に以下の文章を入力してシェルスクリプトの修正版を作ってもらいました。
上記のシェルスクリプトで、ひとつずつのrsyncコマンドが正常に終了したかどうかを記憶し、すべてのrsyncコマンドが終了した後に、その結果を実行したrsyncコマンドごとに表示するように修正してください。
すると、
以下は、与えられたコマンドを元に、修正済みのシェルスクリプトの例です。このスクリプトは、各rsyncコマンドが正常に終了したかどうかを記憶し、すべてのrsyncコマンドが終了した後に、その結果を表示します。
という説明の後に、先ほどとは全く違う形のシェルスクリプトが表示されました。
#!/bin/bash
# 配列で各rsyncコマンドを保持する
commands=( "/home/■■■■■/Documents" "/home/■■■■■/Downloads" "/home/■■■■■/Music" "/home/■■■■■/Pictures" "/home/■■■■■/Videos" )
# 配列で各rsyncコマンドの実行結果を保持する
results=()
# 各rsyncコマンドをループで実行する
for cmd in "${commands[@]}"
do
# rsyncコマンドを実行し、結果をresults配列に追加する
if rsync -auv --delete "$cmd" /media/■■■■■/●●●●●/bkd ; then
results+=("$cmd: 成功")
else
results+=("$cmd: 失敗")
fi
done
# 各rsyncコマンドの実行結果を表示する
for result in "${results[@]}"
do
echo "$result"
done
いかにもプログラムという感じですよね。
さらに、以下の説明文が表示されていました。
このスクリプトでは、commandsという配列で各rsyncコマンドを保持し、resultsという配列で各rsyncコマンドの実行結果を保持しています。各rsyncコマンドをループで実行し、実行結果をresults配列に追加します。rsyncコマンドが正常に終了した場合は、「成功」、失敗した場合は「失敗」という文字列がresults配列に追加されます。
すべてのrsyncコマンドが実行された後、results配列の要素をループで処理し、各rsyncコマンドの実行結果を表示します。
こちらも試してみましたが、正常に作動しました。
これで、シェルスクリプトの中身は完成です。
ChatGPTにLinuxのシェルスクリプトの使い方を教えてもらう
シェルスクリプトが出来上がっても、使い方がわからなければ意味がありません。
ChatGPTに「作成したLinuxのシェルスクリプトの使い方を教えて。」と質問したところ、以下の回答が表示されました。
「1.シェルスクリプトファイルの場所に移動する」は、
ファイラーでシェルスクリプトを保存しているディレクトリを開いて、空いている場所で右クリックして「ここでターミナルを開く」を選択すればいいので、コマンドを使いませんでしたが、
「2.実行権限を与える」
「3.シェルスクリプトを実行する」
は、表示されているコマンドを使いました。
結果は、みごとに成功。
ですが、この方法だと、シェルスクリプトを実行するには、毎回、シェルスクリプトのファイルを保存しているディレクトリまで移動しなくてはならず、面倒です。
このため、どのディレクトリにいても作成したシェルスクリプトを実行できるように設定する方法を追加で質問してみました。
すると、
PATH環境変数にシェルスクリプトの保存先のディレクトリを追加する
シャルスクリプトがあるディレクトリにシンボリックリンクを作成する
という2つの方法があると表示されました。
この部分は色々質問を修正しているうちに回答のデータが無くなってしまったので詳細は紹介できませんが、シンボリックリンクを作成する方が簡単そうだったので、シンボリックリンクを使った方法を、以下の文章で質問しました。
「シェルスクリプトをbkd.shとして/home/■■■■■/Documents/scripts/に保存しました。bkd.shをどのディレクトリにいても使用できるように、シンボリックリンクを使用して設定する方法を教えてください。」
すると、以下の説明文とコマンドが表示されました。
bkd.shをどのディレクトリからでも実行可能にするには、bkd.shがあるディレクトリへのパスを環境変数PATHに追加することができます。または、bkd.shがあるディレクトリにシンボリックリンクを作成することもできます。
以下は、シンボリックリンクを作成する方法の例です。
ln -s /home/■■■■■/Documents/scripts/bkd.sh /usr/local/bin/bkd
さらに、このコマンドの説明文が表示されました。
このコマンドは、/usr/local/binディレクトリにbkdという名前のシンボリックリンクを作成します。このシンボリックリンクは、/home/■■■■■/Documents/scripts/bkd.shを指すようになっています。
これで、bkdというコマンドを実行することで、/home/■■■■■/Documents/scripts/bkd.shが実行されます。ただし、シンボリックリンクを作成するには、rootユーザーの権限が必要な場合があります。
実際にコマンドを実行してみたところ、本当にrootユーザーの権限が必要でした。
このため、実際に使う場合は、以下のように入力して設定します。
sudo ln -s /home/■■■■■/Documents/scripts/bkd.sh /usr/local/bin/bkd
最後に、もう一度試してみます。
先ほどの設定で、コマンドとして登録されたので、以下のコマンドで実行されるようになりました。
bkd
動作も問題ありません。
これで、シェルスクリプトの作成から設定まで完了し、使い方もバッチリ分かりました。
ChatGPTにLinuxのシェルスクリプトを作ってももらう時のコツ
ChatGPTにLinuxのシェルスクリプトを作ってもらうには、少しコツがあります。
それは、
・できるだけ具体的に質問する
・質問の内容はひとつづつにする
・一回で正解を得ようとしない
です。
できるだけ具体的に質問する
概要を知りたいだけなら、それほど神経質にならなくてもいいのですが、きっちりシェルスクリプトを作ってほしいなら、
・主語は抜かさず
・具体的な名称で
・どうして欲しいのかを段階を追って
入力してください。
この記事で紹介した私の質問の内容をもう一度見ていただけると分かると思いますが、普通に人に質問するよりもだいぶクドい内容になっています。
最低でもこれぐらいクドくないと、思った通りの回答は得られません。
そのつもりで内容を考えて質問しましょう。
質問の内容はひとつづつにする
先に紹介したシェルスクリプトを作ってもらう時の質問の内容は、
・コマンドを元にシェルスクリプトを組んでもらう
・コマンド実行後に実行の結果を表示する機能を追加してもらう
の2つでした。
実は、最初はこの2つをまとめて質問していたのですが、出来上がったシェルスクリプトは正常に作動しませんでした。
何回か質問方法を変更して、紹介した質問の内容でやっと成功したという感じです。
また、一度にまとめて質問すると「どの部分がうまくいかなかったのか」がわかりません。
しかし、機能をひとつづつ追加していけば、どの機能がうまく機能しないのかがはっきりわかります。
最悪、うまくできなかった機能はあきらめて、できあがった部分だけ使うということもできます。
質問の内容は、ひとつづつにしましょう。
一回で正解を得ようとしない
この記事では、うまくいった質問と回答だけを紹介しています。
実際は、質問内容を何回も修正し、テストを繰り返したため、何時間もかかって完成しました。
それでも、シェルスクリプトを最初から勉強して自分で組み上げるよりも、はるかに短時間で出来上がりましたので、やる価値は充分にあります。
それなりの労力と時間はかかるつもりでやってみてください。
人と会話するのも大変なのに、AIと対話するなんて、一発でうまく行くわけありませんので、何回も質問するものだと割り切りましょう。
まとめ
Linuxのシェルスクリプトのことをろくに知らないのに、ChatGPTにシェルスクリプトを作ってもらい、その使い方も教えてもらってうまくいったので、その内容と、質問する時のコツを紹介しました。
ChatGPTを使えば、シェルスクリプトを最初から勉強して自分で組み上げるよりも、はるかに短時間で出来上がり、使い方も分かります。
まあ、使い方については、この記事を読んでいただければ、バッチリ分かりますが、作りたいシェルスクリプトの内容は人それぞれなので、この記事を参考にぜひ作ってみてください。