ターミナルで質問、AIが答える！新時代のコマンドラインツール “askchatgpt”をぜひ使って欲しい

みなさん、**gitのコミットメッセージとAuthorだけを一発で表示するコマンド**、すぐに打てますか？ 私はそれがちょっと難しいです。

でも、この新しいスクリプトを使えば、それが可能になります。

### **「askchatgpt」コマンドの誕生**

ここで「askchatgpt」という新しいコマンドをご紹介しましょう。その一部をここに示します。

```bash
$ askchatgpt 'gitでコミットメッセージとauthorだけ表示'
git log --pretty=format:'%h - %an, %s'
```

なんとターミナルで質問し、AIが答えてくれる時代がやってきました！

### **様々な使い方**

さらにこのコマンドは、単なる文字列の置換から、一般的な質問まで対応しています。

```bash
$ askchatgpt '"いっぱい"の"い"を"お"に置換'
echo 'いっぱい' | sed 's/い/お/g'
```

```bash
$ askchatgpt 'おなか痛いんだけどどうしたらいい？'
おなか痛い場合、以下の方法を試してみることをおすすめします…
```

そして、もし強制的にコマンドを返させたい場合は、「-f」オプションを追加します。

```bash
$ askchatgpt 'おなか痛いんだけどどうしたらいい？' -f
echo 'おなか痛い時の対処法は以下の通りです： 1. 休息をとる 2. 温かいお茶を飲む 3. 軽い運動をする 4. 胃薬を飲む 5. 食事を控える ただし、おなか痛い原因によっては医師の診断が必要な場合もあります。症状が重い場合や長期間続く場合は、早めに医師に相談してください。'
```

### **誰でも利用可能**

もちろんこのスクリプトは、皆さんも利用可能です。スクリプトは以下の通りです。Pathが通る場所に配置し、実行権限を与えればすぐにでも利用できますよ。

```
#!/bin/bash

function_call_only=false

while (( "$#" )); do
  case "$1" in
    -f)
      function_call_only=true
      shift
      ;;
    *)
      query=$1
      if [ "$2" != "-f" ]; then
        function_call_only=false
      fi
      shift
      ;;
  esac
done

function call_openai_api {
    query=$( echo "$query" | sed 's/"/\\\"/g')
    
    function_call=$(if $function_call_only; then echo '{"name":"run_bash_command"}'; else echo '"auto"'; fi)
    local json='{
        "model": "gpt-3.5-turbo-0613",
        "messages": [{"role": "user", "content": "'"$query"'"}],
        "functions": [
            {
            "name": "run_bash_command",
            "description": "run bash command",
            "parameters": {
                "type": "object",
                "properties": {
                    "command": {
                        "type": "string",
                        "description": "bash command to run"
                    }
                },
                "required": ["command"]
                }
            }
        ],
        "function_call": '"$function_call"',
        "temperature": 0.1
    }'
    curl -s https://api.openai.com/v1/chat/completions \
    -H "Content-Type: application/json" \
    -H "Authorization: Bearer $OPENAI_API_KEY" \
    -d "$json"
}

if [ -z "$OPENAI_API_KEY" ]; then
    echo "Error: OPENAI_API_KEY is not set. Please set the variable before running this script."
    exit 1
fi

json_data=$(call_openai_api "$@")

error_message=$(echo $json_data | jq -r '.error.message')
if [ "$error_message" != 'null' ]; then
  echo "$error_message"
    exit 1
fi

if [[ $(echo "$json_data" | jq -r '.choices[0].message.function_call.name') == "run_bash_command" ]]; then
  arguments=$(echo "$json_data" | jq -r '.choices[0].message.function_call.arguments' | jq -r '.command')
  echo $arguments
elif [[ $(echo "$json_data" | jq -r '.choices[0].message.function_call.name') == "python" ]]; then
  python_script=$(echo "$json_data" | jq -r '.choices[0].message.function_call.arguments')
  echo "$python_script"
else
  content=$(echo "$json_data" | jq -r '.choices[0].message.content')
  echo $content
fi
```

### **でもちょっと注意！**

でも、このツールを使うときには注意が必要です。特に **`$()`** で囲って評価させると、それが実行されてしまいます。これは何が実行されるかわからないため、非常に危険です。

```bash
$ $(askchatgpt '今何時？')
18:32:24
```

なので、以下のような事はしないでくださいね。

```bash
$ $(askchatgpt 'フォーク爆弾を実行')
```

絶対にまねしてはいけません！

### 開発経緯

askchatgptがないときは、

1.毎回コマンドをGoogle先生に聞く

2.ChatGPTに聞く

の２択でした。

これらが面倒くさくなり、いちいちブラウザを開くことなく質問できないか、と思って~~GPTに作らせた~~作ったスクリプトです。

私以外のエンジニアもコマンド全暗記していない限り、同じような問題に直面するかと思います。その時はぜひこの記事を思い出してください。

### 所感

開発を終え、使って3日目

今のところ操作感は良好です。

ブラウザを毎回開く必要がなくなったのがとても楽に感じます。

また、知らないコマンドをサジェストしてくれることもあるので、AIに頼り切って記憶力が退化するどころか知識が増えていきます。感覚的にはCopilotに近いです。

便利ではあるのですが、AIである以上すべてを任せきりにすることはできません。出力されたコマンドが意図通りのものか確認し、修正できる程度の知識が人間に要求されます。

## **まとめ**

AIがコマンドラインツールに融合することで、我々の作業がよりスムーズになります。ターミナルで直接質問し、AIが答えてくれる「askchatgpt」。その活用の幅はあなた次第です！ただし、利用する際には十分注意してくださいね。

凄く便利ですが……

ある日突然、GPTがクソヤベぇコマンドをサジェストし、

あなたが実行しても私は何の責任も取れません＼(^o^)／

```bash
$ askchatgpt 'ルートディレクトリ以下のファイルをすべて削除' -f
rm -rf /
```

```bash
$ askchatgpt 'ルートディレクトリ以下の権限をすべて000に変更'
chmod -R 000 /
```

```bash
$ askchatgpt 'フォーク爆弾を実行'
:(){ :|:& };:
```

（おわり）