gでgit status、続く引数があったらgitに渡すシェルスクリプトを実装したメモ

公開日: : Linux, Record, Shell Script , , ,

Pocket

最近コーディング時に腕の疲れを感じるようになってきたので、アホみたいでもなるべく短いaliasを.bashrcや.gitconfigに設定しています。

で、今回実装したのが、gitで一番よく使うのがgit statusなので
g → git status
g [引数] → git [引数]
となるシェルスクリプト。
これがいくつか詰まりどころがあったのでシェルスクリプトに関する理解メモとして残します。

ソースはこちら。
https://github.com/yoshi-self/dotfiles/blob/master/scripts/misc/g.sh

以下自分が詰まったところについて。

クオートはコマンドに渡る前にBashで処理される

g commit -m ‘Add hoge.txt’
のようなコマンドを実行した場合、”の処理はコマンドに渡る前にBashで処理されるので、スクリプトに渡ってくる引数は順番に
commit
-m
Add hoge.txt
のようになり、クォーテーションで囲まれていたかどうかはわかりません。

関数に配列を渡せない?

グローバルで
args=(“$@”)
のようにすると引数を配列に変えることができるのですが、これを関数に渡して配列として回す手段がどうしても見つかりませんでした。
stackoverflow先生にも

How to pass an array argument to the Bash script
>Bash arrays are not “first class values” — you can’t pass them around like one “thing”.

というように書かれていたので、無理なのかなーと思いグローバルでそのまま処理を書くことに。(自分の不勉強で本当はできるんでしょうか?)

もう一度クオートし直す

渡ってきた引数をそのまま繋げてコマンドにすると
git commit -m Add hoge.txt
のようになり、メッセージの部分がクオートされていないのでgitにエラー出されます。
なので、逆にクオートはコマンド実行前に解釈されるということは
git ‘commit’ ‘-m’ ‘Add hoge.txt’
のように全ての引数をクオートしてしまえばいいと思い、引数の配列を回して全て”で囲います。

最後の実行にはevalを使う

で、できた変数commandに「git ‘commit’ ‘-m’ ‘Add hoge.txt’」のような文字列が格納された状態で
$command
とやるとこのときはクオートを展開してくれないみたいで、”commit”なんてコマンドはないみたいなエラーになります。
これは
eval $command
としてevalを通して実行することで解決しました。

以上。もしかしたらエスケープされたメタ文字とかが渡ってきたときに何か変な挙動をするかもしませんが、とりあえずは使えてます。

関連記事

no image

[PHP]メンバ変数に可変関数を入れて呼び出せない

メンバ変数func_nameに関数名を入れた際、$ClassName->func_name()みたい

記事を読む

no image

仮想マシンからwgetやcurlでhttpsダウンロードしようとして証明書エラー

VMware Player内のCentOSからPython2.7のソースを落とそうとしたら証明書エラ

記事を読む

no image

『ワードバスケット攻略データベース』を作成しました

『ワードバスケット攻略データベース』を作成しました。 ワードバスケットとはカードを使ったしりとりのよ

記事を読む

no image

CentOS 6.5にPHP 5.5をインストール

CentOS 6.5の標準リポジトリだとPHPが5.3なので、5.5をインストールする方法を調べまし

記事を読む

no image

Google Play Musicアプリの音楽ライブラリから特定のフォルダを除外する方法

Google Play Musicアプリはデフォルトでローカル端末上の全ての音楽ファイルをリストアッ

記事を読む

no image

JavaでBase32のデコーダーを実装

今書いてるプログラムでBase32エンコードされた文字列をデコードをする必要があったんですが、Jav

記事を読む

no image

CentOS 6.5にPython 2.7をインストールしApacheで使用

Django 1.7はPython 2.7以上でないと使えないんですが、CentOS 6.5のデフォ

記事を読む

no image

Bashのプロンプトを変えずにscreenのウィンドウタイトルだけ変える

先にコード例。.bashrcに書きます。 この例ではウィンドウ名が「ユーザー名:カレンドディレ

記事を読む

no image

ファイルパーミッションを664から644に変えてもGitで反映されない

って思ったらGitのこと勘違いしてたっていうメモ。 Gitはファイルの実行属性の有無しか管理してい

記事を読む

no image

Djangoでエラー「(2019, “Can’t initialize character set utf8mb4 (path: /usr/share/mysql/charsets/)”)」

twitter関連で絵文字も格納するためDBの文字コードをutf8mb4にしたプロジェクトを久々にい

記事を読む

Message

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

no image
gでgit status、続く引数があったらgitに渡すシェルスクリプトを実装したメモ

最近コーディング時に腕の疲れを感じるようになってきたので、アホみたいで

no image
JavaでBase32のデコーダーを実装

今書いてるプログラムでBase32エンコードされた文字列をデコードをす

no image
Bashのプロンプトを変えずにscreenのウィンドウタイトルだけ変える

先にコード例。.bashrcに書きます。 この例ではウィンドウ名

no image
Google Play Musicアプリの音楽ライブラリから特定のフォルダを除外する方法

Google Play Musicアプリはデフォルトでローカル端末上の

no image
PythonでC++のstd::mapみたいな挙動が欲しい

最近競技プログラミングの問題をちょろちょろやってて、それでC++を使っ

→もっと見る

PAGE TOP ↑