Macのシェルをzshにアップデートして、man zshの中身を詳しく見てみた

スポンサーリンク
学んでみた
スポンサーリンク
スポンサーリンク
スポンサーリンク

ずっと放置していたzshへのアップデートを実行

 Macのターミナルを起動した時に、毎回出ていた「今のデフォルトのシェルはzshです!」という文言。ずっと無視をしていましたが、ついに重い腰をあげてアップデートを実施することにしました。

 と言っても、コマンドを一行実行するだけで完了します。

chsh -s /bin/zsh

 zshの詳細については、https://support.apple.com/ja-jp/HT208050 を参照してくださいと記載されていたので、確認しました。

zsh について、また、そのコマンドライン補完システムについて調べるには、ターミナルで「man zsh」と入力してください。

と記載されていたので、manコマンドでzshについて調べてみました。
※OSは、macOS Big Sur 11.2

manコマンドでzshについて調べてみた(man zsh)

 manコマンドは、コマンドのマニュアルを表示するものです。以下の通り実行すると、zshのマニュアルを見ることができます。なお、日本語の訳は当サイト執筆者によるものなので、不自然な部分は多めに見て頂けるとありがたいです。

man zsh

概要

 まずは、zshコマンドのマニュアルの概要から見ていきます。

ZSH(1)                                                                                                                                             ZSH(1)

NAME
       zsh - the Z shell

OVERVIEW
       Because zsh contains many features, the zsh manual has been split into a number of sections:

       zsh          Zsh overview (this section)
       zshroadmap   Informal introduction to the manual
       zshmisc      Anything not fitting into the other sections
       zshexpn      Zsh command and parameter expansion
       zshparam     Zsh parameters
       zshoptions   Zsh options
       zshbuiltins  Zsh built-in functions
       zshzle       Zsh command line editing
       zshcompwid   Zsh completion widgets
       zshcompsys   Zsh completion system
       zshcompctl   Zsh completion control
       zshmodules   Zsh loadable modules
       zshtcpsys    Zsh built-in TCP functions
       zshzftpsys   Zsh built-in FTP client
       zshcontrib   Additional zsh functions and utilities
       zshall       Meta-man page containing all of the above

【訳】※ブログ執筆者

ZSH(1)                                                                                                                                             ZSH(1)

名前
       zsh - the Z shell

概要
       zshには多くの機能が含まれているため、zshマニュアルはいくつかのセクションに分割されています:

       zsh          Zsh 概要 (このセクション)
       zshroadmap   マニュアルの略式紹介
       zshmisc      どのセクションにも適さないもの(その他)
       zshexpn      Zsh コマンド and パラメータ展開
       zshparam     Zsh パラメータ
       zshoptions   Zsh オプション
       zshbuiltins  Zsh 組み込み関数
       zshzle       Zsh コマンドライン編集
       zshcompwid   Zsh 補完ウィジット
       zshcompsys   Zsh 補完システム
       zshcompctl   Zsh 補完コントロール
       zshmodules   Zsh 読み込み可能なモジュール
       zshtcpsys    Zsh 組み込み TCP 機能
       zshzftpsys   Zsh 組み込み FTP クライアント
       zshcontrib   追加の zsh 機能 と 用途
       zshall       上記全てを含むMeta-manページ

 今回実行した「man zsh」には、zshの概要のみ記載されているようです。詳細についてはセクションごとに分かれて記載されているので、詳細を知りたい場合は各セクションをmanコマンドで確認する必要があります。

説明

DESCRIPTION
       Zsh  is  a UNIX command interpreter (shell) usable as an interactive login shell and as a shell script command processor.  Of the standard shells,
       zsh most closely resembles ksh but includes many enhancements.  It does not provide compatibility with POSIX or other shells in its default  oper-
       ating mode:  see the section Compatibility below.

       Zsh  has  command line editing, builtin spelling correction, programmable command completion, shell functions (with autoloading), a history mecha-
       nism, and a host of other features.

【訳】※ブログ執筆者

説明
       Zshは、対話型ログインシェルおよびシェルスクリプトコマンド処理装置として使用できるUNIXコマンドインタープリター(シェル)です。
    標準シェルのうち、zshはkshに最もよく似ていますが、多くの拡張機能が含まれています。 
       デフォルトの操作では、POSIXまたは他のシェルとの互換性は提供されません。  

    以下の互換性セクションを参照してください。

       Zshには、コマンドライン編集、組み込みのスペル修正、プログラム可能なコマンド補完、シェル関数(自動読み込みあり)、
    履歴メカニズム、およびその他の多くの機能があります。

 zshは、kshに拡張機能を追加したようなものだと説明しています。 
他のシェルとの互換性については別のセクションを参照するように記載されています。

執筆者

AUTHOR
       Zsh was originally written by Paul Falstad <pf@zsh.org>.  Zsh is now maintained  by  the  members  of  the  zsh-workers  mailing  list  <zsh-work-
       ers@zsh.org>.   The  development  is  currently  coordinated  by  Peter  Stephenson <pws@zsh.org>.  The coordinator can be contacted at <coordina-
       tor@zsh.org>, but matters relating to the code should generally go to the mailing list.

【訳】※ブログ執筆者

執筆者
       Zshは当初PaulFalstadによって書かれました。<pf@zsh.org>.  Zshは、zsh-workersメーリングリストのメンバーによって管理されています。  <zsh-work-
       ers@zsh.org>.   開発は現在、Peter  Stephensonによってまとめられています。 <pws@zsh.org>.  コーディネータとは <coordina-
       tor@zsh.org>で連絡を取れます, しかし コードに関連する事項は、通常、メーリングリストに掲載する必要があります。

 ここではzshのコード執筆者に関する情報が記載されています。連絡することはあまり無いと思いますが、連絡したい時は<coordina-tor@zsh.org>に連絡すれば良いみたいです。

入手方法

VAILABILITY
       Zsh is available from the following HTTP and anonymous FTP site.

       ftp://ftp.zsh.org/pub/
       https://www.zsh.org/pub/
       )

       The up-to-date source code is available via Git from Sourceforge.  See https://sourceforge.net/projects/zsh/ for details.  A summary  of  instruc-
       tions for the archive can be found at http://zsh.sourceforge.net/.

【訳】※ブログ執筆者

入手方法
       Zshは、次のHTTPおよび匿名FTPサイトから入手できます。

       ftp://ftp.zsh.org/pub/
       https://www.zsh.org/pub/
       

       最新のソースコードは、SourceforgeのGitから入手できます。 詳細はhttps://sourceforge.net/projects/zsh/ を見てください。  
    アーカイブの手順の概要は、http://zsh.sourceforge.net/.で見ることができます。

 Zshの入手方法について記載されています。https://www.zsh.org/pub/から入手できます。
最新のものは、https://sourceforge.net/projects/zsh/から入手できます。

メーリングリスト

あまり重要でないので割愛します。

よくある質問

THE ZSH FAQ
       Zsh has a list of Frequently Asked Questions (FAQ), maintained by Peter Stephenson  <pws@zsh.org>.   It  is  regularly  posted  to  the  newsgroup
       comp.unix.shell  and  the  zsh-announce mailing list.  The latest version can be found at any of the Zsh FTP sites, or at http://www.zsh.org/FAQ/.
       The contact address for FAQ-related matters is <faqmaster@zsh.org>.

【訳】※ブログ執筆者

ZSHのよくある質問
       ZshにはPeter Stephensonによって管理されているよくある質問のリストがあります。  <pws@zsh.org>. 
    質問リストはnewsgroup comp.unix.shell  と  the  zsh-announce mailing list に定期的に投稿されています.  
    最新バージョンは、ZshFTPサイトのいずれか, もしくは http://www.zsh.org/FAQ/.で見つけることができます。
       FAQ関連事項の連絡先は<faqmaster@zsh.org>です。

 ここでは、zshについて質問があった時の対処方法が記載されています。

 zshのよくある質問
 http://www.zsh.org/FAQ/

Webページ

THE ZSH WEB PAGE
       Zsh has a web page which is located at https://www.zsh.org/.  This is maintained by Karsten Thygesen <karthy@zsh.org>, of  SunSITE  Denmark.   The
       contact address for web-related matters is <webmaster@zsh.org>.

【訳】※ブログ執筆者

WEBページ
       Zsh には https://www.zsh.org/ というWebページがあります。  これはSunSITE  Denmark の Karsten Thygesen <karthy@zsh.org>, によって管理されています。   
    Webページに関する連絡先は <webmaster@zsh.org> です。

 zshのWebページ
 https://www.zsh.org/

ユーザーガイド

THE ZSH USERGUIDE
       A  userguide  is currently in preparation.  It is intended to complement the manual, with explanations and hints on issues where the manual can be
       cabbalistic, hierographic, or downright mystifying (for example, the word `hierographic' does not exist).  It can be viewed in its  current  state
       at  http://zsh.sourceforge.net/Guide/.  At the time of writing, chapters dealing with startup files and their contents and the new completion sys-
       tem were essentially complete.

【訳】※ブログ執筆者

ZSH ユーザーガイド
       ユーザーガイドは現在準備中です。 
    これはマニュアルを補足することを目的としており、問題に関する説明とヒントが含まれています。 
    現在の状態は http://zsh.sourceforge.net/Guide/ で見ることができます。
    この文章を書いている時点では、スタートアップファイルとその内容、および新しい完了システムを扱う章は基本的に完了しています。

 zshユーザーガイド
 http://zsh.sourceforge.net/Guide/

呼び出し①※量が多いので分割

INVOCATION
       The following flags are interpreted by the shell when invoked to determine where the shell will read commands from:

       -c     Take the first argument as a command to execute, rather than reading commands from a script or standard input.  If  any  further  arguments
              are given, the first one is assigned to $0, rather than being used as a positional parameter.

       -i     Force shell to be interactive.  It is still possible to specify a script to execute.

       -s     Force  shell to read commands from the standard input.  If the -s flag is not present and an argument is given, the first argument is taken
              to be the pathname of a script to execute.

    If there are any remaining arguments after option processing, and neither of the options -c or -s was supplied, the first argument is taken as the
       file  name of a script containing shell commands to be executed.  If the option PATH_SCRIPT is set, and the file name does not contain a directory
       path (i.e. there is no `/' in the name), first the current directory and then the command path given by the variable PATH  are  searched  for  the
       script.  If the option is not set or the file name contains a `/' it is used directly.

       After the first one or two arguments have been appropriated as described above, the remaining arguments are assigned to the positional parameters.

       For further options, which are common to invocation and the set builtin, see zshoptions(1).

【訳】※ブログ執筆者

呼び出し
       次のフラグは、シェルがコマンドを読み取る場所を決定するために呼び出されたときに、シェルによって解釈されます。:

       -c     スクリプトまたは標準入力からコマンドを読み取るのではなく、実行するコマンドとして最初の引数を取ります。
              さらに引数が指定されると、最初の引数は位置パラメーターとして使用されるのではなく、$ 0に割り当てられます。

       -i     シェルを強制的にインタラクティブにします。 実行するスクリプトを指定することは引き続き可能です。

       -s     シェルに標準入力からコマンドを読み取らせます。 
              -sフラグが存在せず、引数が指定されている場合、最初の引数は実行するスクリプトのパス名と見なされます。

    オプション処理後に残りの引数があり、オプション-cまたは-sのいずれも指定されていない場合、最初の引数は、実行されるシェルコマンドを含むスクリプトのファイル名と見なされます。
       オプションPATH_SCRIPTが設定されていて、ファイル名にディレクトリパスが含まれていない場合(つまり、名前に「/」が含まれていない場合)、
      最初に現在のディレクトリ、次に変数PATHで指定されたコマンドパスでスクリプトが検索されます。
      オプションが設定されていない場合、またはファイル名に「/」が含まれている場合は、直接使用されます。

       上記のように最初の1つまたは2つの引数が割り当てられた後、残りの引数は位置パラメーターに割り当てられます。

       呼び出しと組み込みのセットに共通するその他のオプションについては、zshoptions(1)を参照してください。

呼び出し②

The long option `--emulate' followed (in a separate word) by an emulation mode may be  passed  to  the  shell.   The  emulation  modes  are  those
       described  for  the emulate builtin, see zshbuiltins(1).  The `--emulate' option must precede any other options (which might otherwise be overrid-
       den), but following options are honoured, so may be used to modify the requested emulation mode.  Note that  certain  extra  steps  are  taken  to
       ensure  a  smooth emulation when this option is used compared with the emulate command within the shell: for example, variables that conflict with
       POSIX usage such as path are not defined within the shell.

       Options may be specified by name using the -o option.  -o acts like a single-letter option, but takes a following string as the option name.   For
       example,

              zsh -x -o shwordsplit scr
       runs  the  script scr, setting the XTRACE option by the corresponding letter `-x' and the SH_WORD_SPLIT option by name.  Options may be turned off
       by name by using +o instead of -o.  -o can be stacked up with preceding single-letter options, so for example  `-xo  shwordsplit'  or  `-xoshword-
       split' is equivalent to `-x -o shwordsplit'.

       Options may also be specified by name in GNU long option style, `--option-name'.  When this is done, `-' characters in the option name are permit-
       ted: they are translated into `_', and thus ignored.  So, for example, `zsh --sh-word-split' invokes zsh with the SH_WORD_SPLIT option turned  on.
       Like  other  option  syntaxes,  options  can  be  turned  off  by  replacing  the  initial `-' with a `+'; thus `+-sh-word-split' is equivalent to
       `--no-sh-word-split'.  Unlike other option syntaxes, GNU-style long options cannot be stacked with any other options, so for  example  `-x-shword-
       split' is an error, rather than being treated like `-x --shwordsplit'.

       The  special  GNU-style  option  `--version'  is  handled;  it  sends to standard output the shell's version information, then exits successfully.
       `--help' is also handled; it sends to standard output a list of options that can be used when invoking the shell, then exits successfully.

       Option processing may be finished, allowing following arguments that start with `-' or `+' to  be  treated  as  normal  arguments,  in  two  ways.
       Firstly,  a  lone `-' (or `+') as an argument by itself ends option processing.  Secondly, a special option `--' (or `+-'), which may be specified
       on its own (which is the standard POSIX usage) or may be stacked with preceding options (so `-x-' is equivalent to `-x --').  Options are not per-
       mitted  to  be  stacked after `--' (so `-x-f' is an error), but note the GNU-style option form discussed above, where `--shwordsplit' is permitted
       and does not end option processing.

       Except when the sh/ksh emulation single-letter options are in effect, the option `-b' (or `+b') ends option processing.  `-b' is like `--', except
       that further single-letter options can be stacked after the `-b' and will take effect as normal.

【訳】※ブログ執筆者

長いオプション `--emulate 'の後に(別の言葉で)エミュレーションモードが続く場合は、シェルに渡すことができます。
     エミュレーションモードは、組み込みのエミュレートについて説明されているモードです。zshbuiltins(1)を参照してください。
      `--emulate 'オプションは、他のオプションの前に置く必要があります(そうでなければオーバーライドされる可能性があります)が、次のオプションが尊重されるため、
      要求されたエミュレーションモードを変更するために使用できます。
      このオプションをシェル内のemulateコマンドと比較して使用すると、スムーズなエミュレーションを保証するために特定の追加手順が実行されることに注意してください。
      たとえば、パスなどのPOSIXの使用法と競合する変数はシェル内で定義されません。

       オプションは、-oオプションを使用して名前で指定できます。 -oは1文字のオプションのように機能しますが、オプション名として次の文字列を取ります。
       例えば,

              zsh -x -o shwordsplit scr
       は、スクリプトscrを実行し、「-x」でXTRACEオプションを設定し、名前でSH_WORD_SPLITオプションを設定します。 
     -oの代わりに+ oを使用すると、名前でオプションをオフにできます。
     -oは、先行する1文字のオプションと積み重ねることができるため、たとえば、 
    `-xo shwordsplit 'または` -xoshwordsplit'は `-x -o shwordsplit 'と同等です。

       オプションは、GNUロングオプションスタイル `--option-name 'の名前で指定することもできます。
     これが実行されると、オプション名の「-」文字が許可されます。 
    それらは `_ 'に変換されるため、無視されます。したがって、たとえば、 `zsh --sh-word-split 'は、SH_WORD_SPLITオプションをオンにしてzshを呼び出します。
       他のオプション構文と同様に、オプションは最初の「-」を「+」に置き換えることでオフにできます。
       したがって、 `+ -sh-word-split 'は` --no-sh-word-split'と同等です。  
       他のオプション構文とは異なり、GNUスタイルの長いオプションは他のオプションと積み重ねることができないため、
       たとえば、 `-x-shwordsplit 'は、` -x --shwordsplit'のように扱われるのではなく、エラーになります。

       特別なGNUスタイルのオプション `--version 'が処理されます。
       シェルのバージョン情報を標準出力に送信してから、正常に終了します。
       `--help 'も処理されます。
       シェルを呼び出すときに使用できるオプションのリストを標準出力に送信し、正常に終了します。

       オプション処理を終了して、「-」または「+」で始まる次の引数を2つの方法で通常の引数として扱うことができます。       
       まず、引数としての単独の `-'(または` +')は、それ自体でオプション処理を終了します。 
       次に、特別なオプション `-'(または` +-')は、それ自体で指定することも(POSIXの標準的な使用法です)、先行するオプションとスタックすることもできます(したがって、 `-x- 'は`と同等です。 -バツ  - ')。  
       オプションを `-'の後にスタックすることは許可されていません(したがって、` -x-f'はエラーです)が、上記のGNUスタイルのオプション形式に注意してください。

       sh / kshエミュレーションの1文字オプションが有効な場合を除いて、オプション `-b '(または` + b')はオプション処理を終了します。
       `-b 'は`-'に似ていますが、 `-b 'の後にさらに1文字のオプションを積み重ねることができ、通常どおり有効になる点が異なります。

互換性

COMPATIBILITY

       Zsh  tries to emulate sh or ksh when it is invoked as sh or ksh respectively; more precisely, it looks at the first letter of the name by which it
       was invoked, excluding any initial `r' (assumed to stand for `restricted'), and if that is `b', `s' or `k' it will emulate sh  or  ksh.   Further-
       more,  if invoked as su (which happens on certain systems when the shell is executed by the su command), the shell will try to find an alternative
       name from the SHELL environment variable and perform emulation based on that.

       In sh and ksh compatibility modes the following parameters are not special and not initialized by the shell: ARGC, argv, cdpath,  fignore,  fpath,
       HISTCHARS, mailpath, MANPATH, manpath, path, prompt, PROMPT, PROMPT2, PROMPT3, PROMPT4, psvar, status, watch.

       The  usual  zsh  startup/shutdown  scripts are not executed.  Login shells source /etc/profile followed by $HOME/.profile.  If the ENV environment
       variable is set on invocation, $ENV is sourced after the profile scripts.  The value of ENV is subjected to parameter expansion, command substitu-
       tion,  and  arithmetic  expansion  before  being interpreted as a pathname.  Note that the PRIVILEGED option also affects the execution of startup
       files.

       The following options are set if the shell is invoked as sh or ksh:  NO_BAD_PATTERN,  NO_BANG_HIST,  NO_BG_NICE,  NO_EQUALS,  NO_FUNCTION_ARGZERO,
       GLOB_SUBST,  NO_GLOBAL_EXPORT,  NO_HUP,  INTERACTIVE_COMMENTS,  KSH_ARRAYS,  NO_MULTIOS, NO_NOMATCH, NO_NOTIFY, POSIX_BUILTINS, NO_PROMPT_PERCENT,
       RM_STAR_SILENT, SH_FILE_EXPANSION, SH_GLOB, SH_OPTION_LETTERS, SH_WORD_SPLIT.  Additionally the BSD_ECHO and IGNORE_BRACES options are set if  zsh
       is  invoked  as sh.  Also, the KSH_OPTION_PRINT, LOCAL_OPTIONS, PROMPT_BANG, PROMPT_SUBST and SINGLE_LINE_ZLE options are set if zsh is invoked as
       ksh.

【訳】※ブログ執筆者

互換性

       Zshは、shまたはkshとして呼び出されると、それぞれshまたはkshをエミュレートしようとします。
       より正確には、最初の「r」(「restricted」を表すと想定)を除いて、呼び出された名前の最初の文字を調べ、それが「b」、「s」、または「k」の場合はshまたはkshをエミュレートします。
       さらに、suとして呼び出された場合(シェルがsuコマンドによって実行されたときに特定のシステムで発生します)、シェルはSHELL環境変数から代替名を見つけ、それに基づいてエミュレーションを実行しようとします。

       shおよびksh互換モードでは、次のパラメーターは特別ではなく、シェルによって初期化されません:ARGC、argv、cdpath、fignore、fpath、HISTCHARS、mailpath、MANPATH、manpath、
       path、prompt、PROMPT、PROMPT2、PROMPT3、PROMPT4、psvar 、ステータス、ウォッチ。

       通常のzsh起動/シャットダウンスクリプトは実行されません。
       ログインシェルソース/etc/profileの後に$ HOME /.profileが続きます。
       ENV環境変数が呼び出し時に設定されている場合、$ENVはプロファイルスクリプトの後に供給されます。
       ENVの値は、パス名として解釈される前に、パラメーター展開、コマンド置換、および算術展開の対象になります。
       PRIVILEGEDオプションは、スタートアップファイルの実行にも影響することに注意してください

       シェルがshまたはkshとして呼び出される場合、次のオプションが設定されます。 NO_BAD_PATTERN,  NO_BANG_HIST,  NO_BG_NICE,  NO_EQUALS,  NO_FUNCTION_ARGZERO,
       GLOB_SUBST,  NO_GLOBAL_EXPORT,  NO_HUP,  INTERACTIVE_COMMENTS,  KSH_ARRAYS,  NO_MULTIOS, NO_NOMATCH, NO_NOTIFY, POSIX_BUILTINS, NO_PROMPT_PERCENT,
       RM_STAR_SILENT, SH_FILE_EXPANSION, SH_GLOB, SH_OPTION_LETTERS, SH_WORD_SPLIT. 
       さらに、zshがshとして呼び出された場合、BSD_ECHOおよびIGNORE_BRACESオプションが設定されます。
    同様に、zshがksh呼び出された場合、KSH_OPTION_PRINT、LOCAL_OPTIONS、PROMPT_BANG、PROMPT_SUBST、およびSINGLE_LINE_ZLEオプションが設定されます。

 Zshは、shやkshを呼び出して実行することも可能だと書かれています。

制限付きシェル

RESTRICTED SHELL

       When the basename of the command used to invoke zsh starts with the letter `r' or the `-r' command line option  is  supplied  at  invocation,  the
       shell  becomes  restricted.   Emulation mode is determined after stripping the letter `r' from the invocation name.  The following are disabled in
       restricted mode:

       o      changing directories with the cd builtin

       o      changing or unsetting the EGID, EUID, GID, HISTFILE, HISTSIZE, IFS,  LD_AOUT_LIBRARY_PATH,  LD_AOUT_PRELOAD,  LD_LIBRARY_PATH,  LD_PRELOAD,
              MODULE_PATH, module_path, PATH, path, SHELL, UID and USERNAME parameters

       o      specifying command names containing /

       o      specifying command pathnames using hash

       o      redirecting output to files

       o      using the exec builtin command to replace the shell with another command

       o      using jobs -Z to overwrite the shell process' argument and environment space

       o      using the ARGV0 parameter to override argv[0] for external commands

       o      turning off restricted mode with set +r or unsetopt RESTRICTED

       These  restrictions  are  enforced  after  processing the startup files.  The startup files should set up PATH to point to a directory of commands
       which can be safely invoked in the restricted environment.  They may also add further restrictions by disabling selected builtins.

       Restricted mode can also be activated any time by setting the RESTRICTED option.  This immediately enables all the  restrictions  described  above
       even if the shell still has not processed all startup files.

       A  shell  Restricted  Mode  is an outdated way to restrict what users may do:  modern systems have better, safer and more reliable ways to confine
       user actions, such as chroot jails, containers and zones.

       A restricted shell is very difficult to implement safely.  The feature may be removed in a future version of zsh.

       It is important to realise that the restrictions only apply to the shell, not to the commands it runs (except for some shell builtins).   While  a
       restricted  shell  can  only run the restricted list of commands accessible via the predefined `PATH' variable, it does not prevent those commands
       from running any other command.

       As an example, if `env' is among the list of allowed commands, then it allows the user to run any command as `env' is not a shell builtin  command
       and can run arbitrary executables.

       So  when  implementing  a  restricted  shell  framework it is important to be fully aware of what actions each of the allowed commands or features
       (which may be regarded as modules) can perform.

       Many commands can have their behaviour affected by environment variables.  Except for the few listed above, zsh does not restrict the  setting  of
       environment variables.


       If  a  `perl',  `python',  `bash',  or  other  general purpose interpreted script it treated as a restricted command, the user can work around the
       restriction by setting specially crafted `PERL5LIB', `PYTHONPATH', `BASHENV' (etc.) environment variables. On GNU systems, any command can be made
       to  run  arbitrary code when performing character set conversion (including zsh itself) by setting a `GCONV_PATH' environment variable.  Those are
       only a few examples.

       Bear in mind that, contrary to some other shells, `readonly' is not a security feature in zsh as it can be undone and so cannot be used  to  miti-
       gate the above.

       A  restricted shell only works if the allowed commands are few and carefully written so as not to grant more access to users than intended.  It is
       also important to restrict what zsh module the user may load as some of them, such as `zsh/system', `zsh/mapfile' and `zsh/files', allow bypassing
       most of the restrictions.

【訳】※ブログ執筆者

制限付きシェル

       zshの呼び出しに使用されるコマンドのベース名が文字「r」で始まる場合、または呼び出し時に「-r」コマンドラインオプションが指定されている場合、シェルは制限されます。 
    エミュレーションモードは、呼び出し名から文字「r」を取り除いた後に決定されます。 
    
    以下は制限モードでは無効になっています:

       o      cdビルトインでディレクトリを変更する

       o      EGID、EUID、GID、HISTFILE、HISTSIZE、IFS、LD_AOUT_LIBRARY_PATH、
        LD_AOUT_PRELOAD、LD_LIBRARY_PATH、LD_PRELOAD、MODULE_PATH、module_path、
        PATH、path、SHELL、UID、およびUSERNAMEパラメーターの変更または設定解除

       o      /を含むコマンド名を指定する

       o      ハッシュを使用してコマンドパス名を指定する

       o      出力をファイルにリダイレクトする

       o      exec組み込みコマンドを使用してシェルを別のコマンドに置き換える

       o      ジョブ-Zを使用して、シェルプロセスの引数と環境スペースを上書き

       o      ARGV0パラメーターを使用して、外部コマンドのargv [0]をオーバーライド

       o      set + rまたはunsetoptRESTRICTEDで制限モードをオフにする

       これらの制限は、スタートアップファイルの処理後に適用されます。
     スタートアップファイルは、制限された環境で安全に呼び出すことができるコマンドのディレクトリを指すようにPATHを設定する必要があります。
       また、選択したビルトインを無効にすることで、さらに制限を加えることもできます。

       制限付きモードは、RESTRICTEDオプションを設定することでいつでもアクティブにできます。
       これにより、シェルがまだすべてのスタートアップファイルを処理していない場合でも、上記のすべての制限がすぐに有効になります。

       シェル制限モードは、ユーザーが実行できることを制限する古い方法です。
       最近のシステムには、chrootジェイル、コンテナー、ゾーンなどのユーザーアクションを制限するためのより優れた、より安全で信頼性の高い方法があります。

       制限されたシェルを安全に実装することはとても難しいです。
    この機能は、zshの将来のバージョンで削除される可能性があります。

       制限はシェルにのみ適用され、実行するコマンドには適用されないことを理解することが重要です(一部のシェル組み込みを除く)。
    制限付きシェルは、事前定義された「PATH」変数を介してアクセスできるコマンドの制限付きリストのみを実行できますが、それらのコマンドが他のコマンドを実行することを妨げることはありません。

       例として、「env」が許可されたコマンドのリストに含まれている場合、「env」はシェル組み込みコマンドではなく、任意の実行可能ファイルを実行できるため、ユーザーは任意のコマンドを実行できます。

       したがって、制限付きシェルフレームワークを実装する場合は、許可された各コマンドまたは機能(モジュールと見なされる場合があります)が実行できるアクションを十分に理解することが重要です

       多くのコマンドは、環境変数の影響を受けて動作する可能性があります。
       上記のいくつかを除いて、zshは環境変数の設定を制限しません。


       `perl '、` python'、 `bash '、またはその他の汎用インタープリター型スクリプトが制限付きコマンドとして扱われた場合、ユーザーは、特別に細工された「PERL5LIB」、「PYTHONPATH」、「BASHENV」(など)環境変数を設定することにより、制限を回避できます。
        GNUシステムでは、 `GCONV_PATH '環境変数を設定することにより、文字セット変換(zsh自体を含む)を実行するときに任意のコードを実行するように任意のコマンドを作成できます。 
        これらはほんの一例です。

       他のいくつかのシェルとは異なり、「読み取り専用」は元に戻すことができ、上記を軽減するために使用できないため、zshのセキュリティ機能ではないことに注意してください。

       制限付きシェルは、許可されたコマンドが少なく、意図したよりも多くのアクセスをユーザーに許可しないように注意深く記述されている場合にのみ機能します。
     また、 `zsh / system '、` zsh / mapfile'、 `zsh / files 'など、ユーザーがロードできるzshモジュールを制限することも重要です。これにより、ほとんどの制限を回避できます。

 制限付きシェルの設定をした時に実行できない事柄について書かれています。

起動/終了 ファイル

STARTUP/SHUTDOWN FILES

       Commands are first read from /etc/zshenv; this cannot be overridden.  Subsequent behaviour is modified by the RCS and GLOBAL_RCS options; the for-
       mer affects all startup files, while the second only affects global startup files (those shown here with an path starting with a /).   If  one  of
       the  options  is unset at any point, any subsequent startup file(s) of the corresponding type will not be read.  It is also possible for a file in
       $ZDOTDIR to re-enable GLOBAL_RCS. Both RCS and GLOBAL_RCS are set by default.

       Commands are then read from $ZDOTDIR/.zshenv.  If the shell is a login shell, commands are read from /etc/zprofile  and  then  $ZDOTDIR/.zprofile.
       Then,  if the shell is interactive, commands are read from /etc/zshrc and then $ZDOTDIR/.zshrc.  Finally, if the shell is a login shell, /etc/zlo-
       gin and $ZDOTDIR/.zlogin are read.

       When a login shell exits, the files $ZDOTDIR/.zlogout and then /etc/zlogout are read.  This happens with either an explicit exit via the  exit  or
       logout  commands, or an implicit exit by reading end-of-file from the terminal.  However, if the shell terminates due to exec'ing another process,
       the logout files are not read.  These are also affected by the RCS and GLOBAL_RCS options.  Note also that the RCS option affects  the  saving  of
       history files, i.e. if RCS is unset when the shell exits, no history file will be saved.

       If ZDOTDIR is unset, HOME is used instead.  Files listed above as being in /etc may be in another directory, depending on the installation.

       As  /etc/zshenv  is  run  for all instances of zsh, it is important that it be kept as small as possible.  In particular, it is a good idea to put
       code that does not need to be run for every single shell behind a test of the form `if [[ -o rcs ]]; then ...' so that it  will  not  be  executed
       when zsh is invoked with the `-f' option.

       Any  of these files may be pre-compiled with the zcompile builtin command (see zshbuiltins(1)).  If a compiled file exists (named for the original
       file plus the .zwc extension) and it is newer than the original file, the compiled file will be used instead.

【訳】※ブログ執筆者

起動/終了 ファイル

       コマンドは最初に /etc/zshenv から読み込みます。; これは上書きできません。
     その後の動作は、RCSおよびGLOBAL_RCSオプションによって変更されます; 
    前者のRCCはすべてのスタートアップファイルに影響し、後者のGLOBAL_RCSはグローバルスタートアップファイルにのみ影響します。   
    オプションの1つがいずれかの時点で設定解除されている場合、対応するタイプの後続のスタートアップファイルは読み取られません。  
    $ ZDOTDIR内のファイルでGLOBAL_RCSを再度有効にすることもできます。 RCSとGLOBAL_RCSの両方がデフォルトで設定されています。

       次に、コマンドは$ZDOTDIR/.zshenvから読み込みます。  
    シェルがログインシェルの場合、コマンドは/etc/zprofileから読み取られ、次に$ZDOTDIR/.zprofileから読み取られます。
       そして、シェルが対話型の場合、コマンドは/etc/zshrcから読み取られ、次に$ZDOTDIR/.zshrcから読み取られます。  
    最後に、シェルがログインシェルの場合、/etc/zloginと$ ZDOTDIR/.zloginが読み取られます。

       ログインシェルが終了すると、ファイル$ ZDOTDIR / .zlogout、次に/ etc/zlogoutが読み取られます。  
    これは、exitコマンドまたはlogoutコマンドによる明示的な終了、または端末からファイルの終わりを読み取ることによる暗示的な終了のいずれかで発生します。 
    ただし、別のプロセスを実行したためにシェルが終了した場合、ログアウトファイルは読み取られません。
    これらは、RCSおよびGLOBAL_RCSオプションの影響も受けます。 
    RCSオプションは、履歴ファイルの保存に影響することにも注意してください。
     シェルの終了時にRCSが設定されていない場合、履歴ファイルは保存されません。

       ZDOTDIRが設定されていない場合、代わりにHOMEが使用されます。
       上記の/etcにあるファイルは、インストールによっては別のディレクトリにある場合があります。

       /etc/zshenvはzshのすべてのインスタンスに対して実行されるため、可能な限り小さく保つことが重要です。 
       特に、 `if [[-o rcs]];の形式のテストの背後に、すべてのシェルに対して実行する必要のないコードを配置することをお勧めします。次に... 'を使用して、「-f」オプションを指定してzshを呼び出したときに実行されないようにします。

       これらのファイルはいずれも、zcompile組み込みコマンドを使用してプリコンパイルできます。 (zshbuiltins(1)を見てください).  
    コンパイル済みファイルが存在し(元のファイルと.zwc拡張子にちなんで名付けられている)、元のファイルよりも新しい場合は、代わりにコンパイル済みファイルが使用されます。

/etc/zshenvは、最初に読み込まれるファイルです。全てのインスタンスで実行されるため、可能な限り小さいファイルにする必要があります。

ログインシェル起動時

ログインシェル起動時は以下の順番で読み込みます。

  1. /etc/zshenv
  2. $ZDOTDIR/.zshenv
  3. etc/zprofile
  4. $ZDOTDIR/.zprofile
  5. /etc/zshrc
  6. $ZDOTDIR/.zshrc
  7. /etc/zlogin
  8. $ZDOTDIR/.zlogin

対話型シェル起動時

対話型シェル起動時は以下の順番で読み込みます。

  1. /etc/zshenv
  2. $ ZDOTDIR /.zshenv
  3. /etc/zshrc
  4. $ZDOTDIR/.zshrc

ファイル

FILES
       $ZDOTDIR/.zshenv
       $ZDOTDIR/.zprofile
       $ZDOTDIR/.zshrc
       $ZDOTDIR/.zlogin
       $ZDOTDIR/.zlogout
       ${TMPPREFIX}*   (default is /tmp/zsh*)
       /etc/zshenv
       /etc/zprofile
       /etc/zshrc
       /etc/zlogin
       /etc/zlogout    (installation-specific - /etc is the default)

 zshについては、情報を整理して今後も更新していきます。

学んでみた
スポンサーリンク
スポンサーリンク
bond.motherをフォローする
スポンサーリンク
ProgrammingのMITA!

コメント

プロフィール

当ブログの管理者。主にインフラエンジニアとして仕事をしています。

bond.motherをフォローする
タイトルとURLをコピーしました