Paepoi

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)gnome-terminal (bash 5)
    新規ウインドウcommand+NCtrl+Shift+N
    新規タブcommand+TCtrl+Shift+T
    タブを閉じるcommand+Wbash 自体を Ctrl+D で終了させる
    終了command+Qbash 自体をすべて Ctrl+D で終了させる
    切り取り
    コピー
    貼り付け
    command+X
    command+C
    command+V
    Ctrl+Shift+X
    Ctrl+Shift+C
    Ctrl+Shift+V
    セッションの終了control+DCtrl+D
    強制終了control+CCtrl+C
    Terminal.app で zsh 自体を control+D で終了させると無反応になるので注意。

    コマンドの違い
    大文字小文字
    # 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 グロ画像.png
    GUI アプリの単独起動
    # 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.txt
    Finder で実行すると 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ユーザー名
    \vbash のバージョン *.*
    \Vbash のバージョン *.*.*
    \w現在位置、パンくずリスト有り(~/himitu/ero/douga)
    \W現在位置、パンくずリスト無し(douga)
    \!~/.bash_history に保存される行番号
    \#実行したコマンドの数で繰り上げ
    \$UID がゼロ(root)なら # を $ に変更
    \nnn8 進数で記号を指定できる('\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

  • Copyright(C) sasakima-nao All rights reserved 2002 --- 2024.