😇

ターミナルで使えるコマンドを作ろうとしたら苦労した話。

2025/03/12に公開

初めまして。趣味のRustで変なの書いてる者です。
久々にプログラミングがやりたくなったので、適当にアプデなんか済ませて書いてたら。。

ディレクトリ分けるとき、mod.rs書くのだるくね?

昔からそうは思っていたのですが、不満を垂らすだけで解消する動きはなかったので、これを機にディレクトリ生成とそれに付随してmod.rsを行うシェルを組もうと思いました。

以下シェルになります。

rsdir.sh
#!/bin/bash

# 引数チェック
if [ -z "$1" ]; then
    echo "Usage: rsdir <module_name>"
    exit 1
fi

# モジュールディレクトリ作成
mkdir -p "$1" && touch "$1/mod.rs"

echo "Module '$1' created with mod.rs."

「シェルも用意したし、シンボリックリンク貼って終わりだなー」とのんきにしていましたが、いざリンクを貼って実行してみてもディレクトリが作られるだけで肝心のmod.rsは存在せず。

どこやらかしてんのかなーと、ファイル権限やオプションなど確認したりなどしましたが、それでも思うようには実行されず、フラストレーションがたまりにたまったので天下のChatGPT先生を頼りに行きました。

ChatGPT

1. スクリプトに実行権限があるか?
2. シンボリックリンクのパスが正しく /usr/local/bin/rsdir を指しているか?
3. #!/bin/bash の shebang が正しいか?
4. パスが通っているか?
5. 何かエラーが出ていないか?

まとめ
まず、以下を順番にチェックしてください:

chmod +x ~/rsdir.sh で実行権限を付与したか?
ls -l /usr/local/bin/rsdir でリンク先が正しいか?
#!/bin/bash になっているか?
echo $PATH で /usr/local/bin にパスが通っているか?
bash -x ~/rsdir.sh my_module でデバッグメッセージが出るか?
これらを試しても動かない場合、エラーメッセージを貼ってくれれば、さらに詳しく調べます!

と、仰った。ちょっと前まで小ばかにしていたけど、こんなに丁寧でわかりやすいなんて本当に衝撃でした。

一個ずつ試してみると五個目の何かエラーが出ていないか?で無事躓きました。

 ~ $ bash -x /usr/local/bin/rsdir
bash: /usr/local/bin/rsdir: No such file or directory

ファイルやディレクトリがないみたいで。つまりシンボリックリンクが壊れていたようです。
/usr/local/binを確認したところ、、

 bin $ ll rsdir
lrwxrwxrwx 31 root 12 Mar 07:29 rsdir -> commands/rsmkdir.sh

あ...これ、パスがおかしかったんですよね...本当に恥ずかしい。

改めてシンボリックリンクを作成し、

 ~ $ sudo ln -s ~/commands/rsdir.sh /usr/local/bin/rsdir
 ~ $ ll /usr/local/bin/rsdir 
lrwxrwxrwx 31 root 12 Mar 07:29 /usr/local/bin/rsdir -> /home/Ennui/commands/rsdir.sh

実行。

 commands $ rsdir hogehoge
Module 'hogehoge' created with mod.rs.
 commands $ tree
.
├── general
│  └── mod.rs
├── hogehoge
│  └── mod.rs
├── mod.rs
└── spotify
   └── mod.rs

無事に動きました。よかったです。

まとめ

お恥ずかしいことに30~40分を費やしなんとか解決でき、日々の積み重ねがどれほど大事か痛感しました...。精進します。

参考文献

ターミナルで使える自作コマンドを作る:3.1-2 シンボリックリンクを貼る

ちゃんと見ていればなぁ~、TT

Discussion