Paepoi » ShellScript Tips » ShellScript Tips | gnome-terminal と Terminal.app
ShellScript Tips | gnome-terminal と Terminal.app
# 最終更新日 2023.02.12
- 2023 年現在での表記に変更(espeak-ng 等)と細かい追記
UNIX 系 OSでは POSIX 準拠のコマンドはすべて同様に扱えます。
しかし端末の操作性やサービス等の拡張部分では OS によって異なります。
gnome-terminal は RedHat 系でデフォルトシェルの bash 5 で確認。
macOS はデフォルトシェルの zsh にて確認しています。
[Tab] キー
長いファイル名やディレクトリを指定する場合や特定コマンドでは
先頭の数文字をタイプして [Tab] キーを叩くと保管してくれます。
上下矢印キー
上矢印キーで前回打ち込んだコマンドの履歴が辿れる、下なら逆。
違い一覧
Terminal.app で zsh 自体を control+D で終了させると無反応になるので注意。
実行パーミッション +x を付加すればシバンで実行される。
ちなみに拡張子はまったく無意味、macOS でもコマンドでは単なる目印です。
macOS では実行パーミッションを付けて拡張子無しにするとアイコンが変わる。
Nautilus では Enter で実行するかどうかを Nautilus の設定で決めます。
Finder では command+O で実行するには拡張子を取り払う必要あり。
標準出力先が /dev/null になり捨てられるので必要ならリダイレクトでまかなう。
カレントディレクトリはスクリプトファイルがある位置に設定される。
ただしどのディレクトリで実行してもカレントディレクトリがルート "/" に設定される。
なので実行前に移動する必要あり、$0 にフルパスが指定されるので以下のように。
zsh: 13 Prompt Expansion
下記は bash のプロンプト指定です。
bash:tip_colors_and_formatting - FLOZz' MISC
シェルではなく端末側の機能です、gnome-terminal Terminal.app 共対応。
基本的なものを書き出ししておきます、256 色指定等はリンク先で。
カーソルの移動も可能、たとえば
文字数分は半角換算です、全角の半分が消去された場合その文字は失なわれる。
Cursor Movement
- 2023 年現在での表記に変更(espeak-ng 等)と細かい追記
UNIX 系 OSでは POSIX 準拠のコマンドはすべて同様に扱えます。
しかし端末の操作性やサービス等の拡張部分では OS によって異なります。
gnome-terminal は RedHat 系でデフォルトシェルの bash 5 で確認。
macOS はデフォルトシェルの zsh にて確認しています。
キーボードショートカットの違い
共通項目先頭の数文字をタイプして [Tab] キーを叩くと保管してくれます。
違い一覧
操作 | Terminal.app (zsh) | gnome-terminal (bash 5) |
---|---|---|
新規ウインドウ | command+N | Ctrl+Shift+N |
新規タブ | command+T | Ctrl+Shift+T |
タブを閉じる | command+W | bash 自体を Ctrl+D で終了させる |
終了 | command+Q | bash 自体をすべて Ctrl+D で終了させる |
切り取り コピー 貼り付け | command+X command+C command+V | Ctrl+Shift+X Ctrl+Shift+C Ctrl+Shift+V |
セッションの終了 | control+D | Ctrl+D |
強制終了 | control+C | Ctrl+C |
コマンドの違い
大文字小文字# macOS はパス名やファイル名の大文字小文字を区別しない # なので /bin 以下にある POSIX コマンドなら大文字でも使える ECHO Hello #=> Hello # 冗談みたいだけど macOS では以下も普通に可能 # もちろん実名は Documents です cd documents && pwd #=> /Users/sasakima-nao/documents # 面白いことに mac の bash は大文字小文字が違っても Tab キー保管可能 # zsh や gnome-terminal では普通に無視される cd doc[ココで tab キーを叩く] # ただし macOS では Windows と違い大文字小文字でリネームは可能 mv IMG_0001.MOV img_0001.mov # Fedora というか Linux は明確に区別する ECHO Hello #=> bash: ECHO: コマンドが見つかりませんでした...sudo で GUI は使えないのは現在では同様
# macOS は vi や nano 等のスクリーンエディタのみ
# GNOME も 3.22 以降は GUI が使えなくなったので現在は共通です
sudo vi httpd.conf
サービスの起動(例として Apache)# macOS sudo apachectl start # GNOME sudo systemctl start httpd.service次回起動時よりサービスの自動開始(例として Apache)
# macOS sudo launchctl load -w /System/Library/LaunchDaemons/org.apache.httpd.plist # GNOME sudo systemctl enable httpd.service音声読み上げ
# macOS say "Homra chan" # GNOME、espeak-ng はひらがなカタカナなら日本語認識できます espeak-ng "Homra chan" espeak-ng -v ja ほむらちゃん
コマンドで GUI
現在のカレントディレクトリをファイルマネージャで開く (open と gio コマンド)# macOS open . # GNOME は gvfs-open でしたが 3.24 から gio コマンドに変わりました gio open . # gio コマンドは gvfs URI ならどんなものでも開けます gio open trash:///ファイルのデフォルトアプリ起動
# macOS open エロ画像.jpg # GNOME gio open グロ画像.pngGUI アプリの単独起動
# macOS フルパス必須なので多用する人は ~/.zshrc か ~/.zprofile にエイリアス推奨 open -n /Applications/Atom.app # Linux は CUI と GUI に違いは無い gedit指定 GUI アプリでファイルを開く
# macOS この場合はフルパスや app 拡張子はいらない open -a Atom kawasaki.txt # GNOME はやはり CUI と GUI に違いは無い atom kawasaki.txtファイルをゴミ箱に捨てる
# macOS ありません、自作しましたので参考に # GNOME gio trash いらないファイル.md
スクリプトファイルの違い
UNIX 系 OS では端末エミュレータでの動作はまったく同じです。実行パーミッション +x を付加すればシバンで実行される。
ちなみに拡張子はまったく無意味、macOS でもコマンドでは単なる目印です。
macOS では実行パーミッションを付けて拡張子無しにするとアイコンが変わる。
cat test.sh #!/bin/sh echo 端末から実行 mv test.sh tes chmod +x tes ./tes 端末から実行ファイルマネージャーからの実行はかなり違います。
Nautilus では Enter で実行するかどうかを Nautilus の設定で決めます。
Finder では command+O で実行するには拡張子を取り払う必要あり。
#!/bin/sh ls上記を Nautilus で実行すると実行はされますが何もおこりません。
標準出力先が /dev/null になり捨てられるので必要ならリダイレクトでまかなう。
カレントディレクトリはスクリプトファイルがある位置に設定される。
#!/bin/sh ls > output.txtFinder で実行すると Terminal.app が立ち上がり ls の結果を出力する。
ただしどのディレクトリで実行してもカレントディレクトリがルート "/" に設定される。
なので実行前に移動する必要あり、$0 にフルパスが指定されるので以下のように。
#!/bin/sh cd `dirname $0` ls
プロンプトのカスタマイズ
zsh についてはキリが無いので公式をご覧ください。zsh: 13 Prompt Expansion
下記は bash のプロンプト指定です。
# $PS1 シェル変数を変更することでカスタマイズできる # デフォルトの確認 echo $PS1 #=>'[\u@\h \W]\$ ' # 改行になった場合に出る > もシェル変数 echo $PS2 #=>'> ' # 変更するには PS1 シェル変数に代入 # インスタンスが終了するまでは適用されたままになる # 恒久に適用させたい場合は ~/.bashrc に書き込み PS1='スズキカタナ \W \$ '
指定 | 結果 |
---|---|
文字列 | 一部の記号を除き普通に |
${**} | 環境変数を入れることもできる |
\a | 音が鳴る |
\d | 日付 |
\D{format} | strftime の書式で日時(e,g, '\D{%r} ') |
\e | エスケイプ |
\h | ホスト名 localhost.localdomain ならドットより前 |
\H | ホスト名 localhost.localdomain なら全部 |
\j | カレントのジョブ番号 |
\l | /dev/pts/* の何番か |
\n | 改行(必要なの?) |
\r | キャッジリターン(必要なの?) |
\s | シェルの名前 |
\t | '\D{%H:%M:%S} ' と同じ |
\T | '\D{%I:%M:%S} ' と同じ |
\@ | '\D{%I:%M %p} ' と同じ |
\A | '\D{%H:%M} ' と同じ |
\u | ユーザー名 |
\v | bash のバージョン *.* |
\V | bash のバージョン *.*.* |
\w | 現在位置、パンくずリスト有り(~/himitu/ero/douga) |
\W | 現在位置、パンくずリスト無し(douga) |
\! | ~/.bash_history に保存される行番号 |
\# | 実行したコマンドの数で繰り上げ |
\$ | UID がゼロ(root)なら # を $ に変更 |
\nnn | 8 進数で記号を指定できる('\041 ' で'!') |
\\ | バックスラッシュをどうしても使いたい場合に |
\[ | 表示されない文字列開始 |
\] | 表示されない文字列終了 |
表示色のカスタマイズ
下記サイトにとても詳しい解説があります。bash:tip_colors_and_formatting - FLOZz' MISC
シェルではなく端末側の機能です、gnome-terminal Terminal.app 共対応。
基本的なものを書き出ししておきます、256 色指定等はリンク先で。
# '\033[' と 'm' で指定数値を囲めば文字色を変更できる # とよく見かけるけど '\e[' や 'x1B[' でもいい、033 が 8 進数で 0x1B と同義なのは解るね # e は escape の頭文字です、一番短く書けるのでコレを主体にしよう # echo -e か printf でエスケープを有効にする必要有り # 0 デフォルトに戻る # 1 強調 # 2 薄暗い色にする # 4 アンダーライン # 5 点滅 # 7 反転 # 8 非表示 # 上記を +20 するとリセットになる # 30 Black # 31 Red # 32 Green # 33 Brown # 34 Blue # 35 Purple # 36 Cyan # 37 Light Gray # 39 デフォルト色 # 上記を +10 すると背景色として適用される # 背景色を変更した場合は即時リセットしないと次の行全体にも適用されてしまう # 組み合わせするには '1;31' ののようにセミコロンで区切る printf "ここから\e[4mアンダーライン\e[24mここまで\n" printf "リセットされたので普通に出力される\n" printf "突然\e[36m文字を水色にする\n" echo もちろん echo にしても引き継がれる printf "引き継いだまま\e[45m背景を紫色にする\e[49m即リセットを忘れずに\n" printf "\e[1;31;46m組み合わせで全部一揆に適用\e[0m\n" echo おしまい # PS1 シェル変数にも入れられます # 表示されない文字列指定を入れないとおかしくなる場合がある # PS1="\[\e[32m\]__プロンプト文字列のみ色を変更__$\[\e[0m\] "
カーソルの移動
端末のエスケープは表示色だけではありません。カーソルの移動も可能、たとえば
printf "\e[4;5H"とするとプロンプトが 4 行目 5 文字目に移動します。
文字数分は半角換算です、全角の半分が消去された場合その文字は失なわれる。
Cursor Movement
# カーソルを N 行分上げる # \e[<N>A # カーソルを N 行分下げる # \e[<N>B # カーソルを N 文字分進める # \e[<N>C # カーソルを N 文字分戻す # \e[<N>D # 画面をスクロールでクリア # \e[2J # 行末まで消去、\e[0J でも同じ # \e[K # カーソル位置の保存 # \e[s # カーソル位置の復元 # \e[u # 文字数の先頭はゼロです echo テストですテストです printf "\e[1A\e[6Caaa\n" #=> テストaaa テストです # 期待どおりになります echo いくぞー for s in いーち にー さーん だぁー!; do sleep 1 printf "\e[1A\e[K$s\n" done