declare -F
主な質問:現在のシェルの値とシェルが始まったばかりの値との間のデルタを取得する方法(以下の最初の2つのコマンド)$(declare -F)
のため、問題を解決できませんでした。サブシェルはシェルプロセスのコピーです。。子会社:以下の3番目のコマンドが何も出力しないのはなぜですか?
$ exec env -i bash
$ declare -F
declare -f ShowInstallerIsoInfo
declare -f __expand_tilde_by_ref
declare -f __get_cword_at_cursor_by_ref
declare -f __load_completion
declare -f __ltrim_colon_completions
declare -f __parse_options
declare -f __reassemble_comp_words_by_ref
declare -f _allowed_groups
declare -f _allowed_users
declare -f _available_interfaces
declare -f _bashcomp_try_faketty
declare -f _bq_completer
declare -f _cd
declare -f _cd_devices
declare -f _command
declare -f _command_offset
declare -f _complete_as_root
declare -f _completer
declare -f _completion_loader
declare -f _configured_interfaces
declare -f _count_args
declare -f _dvd_devices
declare -f _expand
declare -f _filedir
declare -f _filedir_xspec
declare -f _fstypes
declare -f _get_comp_words_by_ref
declare -f _get_cword
declare -f _get_first_arg
declare -f _get_pword
declare -f _gids
declare -f _have
declare -f _included_ssh_config_files
declare -f _init_completion
declare -f _installed_modules
declare -f _ip_addresses
declare -f _kernel_versions
declare -f _known_hosts
declare -f _known_hosts_real
declare -f _longopt
declare -f _mac_addresses
declare -f _minimal
declare -f _modules
declare -f _ncpus
declare -f _open_files_for_editing
declare -f _parse_help
declare -f _parse_usage
declare -f _pci_ids
declare -f _pgids
declare -f _pids
declare -f _pnames
declare -f _python_argcomplete
declare -f _quote_readline_by_ref
declare -f _realcommand
declare -f _rl_enabled
declare -f _root_command
declare -f _service
declare -f _services
declare -f _shells
declare -f _signals
declare -f _split_longopt
declare -f _sysvdirs
declare -f _terms
declare -f _tilde
declare -f _uids
declare -f _upvar
declare -f _upvars
declare -f _usb_ids
declare -f _user_at_host
declare -f _usergroup
declare -f _userland
declare -f _variables
declare -f _xfunc
declare -f _xinetd_services
declare -f dequote
declare -f quote
declare -f quote_readline
$ "$SHELL" -c 'declare -F'
その他:
$ uname -a
Linux elitebook 6.7.3-arch1-2 #1 SMP PREEMPT_DYNAMIC Fri, 02 Feb 2024 17:03:55 +0000 x86_64 GNU/Linux
$ bash --version
GNU bash, version 5.2.26(1)-release (x86_64-pc-linux-gnu)
$ echo $SHELL
/bin/bash
修正する:
クリーンアップ状態は、出力に示すように空の関数のリストです。
bash -c 'declare -F'
最初のコマンドに基づいて、2番目のコマンドはゼロではなく2つの関数を出力すると予想しました。
$ grep -F -f <(declare -F | cut --delimiter=' ' --fields=3) ~/.bashrc | grep -v -E '^#' | wc -l
2
$ bash -c 'source ~/.bashrc; declare -F'
アップデート2
私は2番目の関数がゼロではなく2つの関数を出力すると予想しました。
購入が適用されない理由は次のとおりです。
$ cat ~/.bashrc
#
# ~/.bashrc
#
# If not running interactively, don't do anything
[[ $- != *i* ]] && return
回避策は両方の機能を出力します。
$ bash -c 'source <(grep -v '\''!= *i*'\'' ~/.bashrc); compgen -A function' 2>/dev/null
答え1
シェルの起動後に関数のリストから何が変更されたかを知り、起動ファイルを取得するには、bash関数名に改行文字を含めることはできないため、関数のリストを1行に1つcompgen -A function
ずつダンプし、comm
異なる時間を比較できます。ポイントダンプ(同じロケールでソートする必要があります)
次に追加:
initial_functions=$(compgen -A function | LC_ALL=C sort)
実行が終わったら、~/.bashrc
以下を実行します。
LC_ALL=C comm -13 <(printf '%s\n' "$initial_functions") \
<(compgen -A function | LC_ALL=C sort)
以降に追加された内容を確認してください。
LC_ALL=C comm -23 <(printf '%s\n' "$initial_functions") \
<(compgen -A function | LC_ALL=C sort)
削除された方のため。
zshに対応する内容は次のとおりです。
initial_functions=( ${(k)functions} )
() { print -rC1 -- ${argv:|initial_functions}; } ${(k)functions}
() { print -rC1 -- ${initial_functions:|argv}; } ${(k)functions}
とにかくzshのようなbashはそれ自体は何も定義しませんので注意してください。きれいな状態の出力に示すように、これは空の関数のリストですbash -c 'declare -F'
。
表示できるすべての関数は、環境から取得するか(bash
環境変数を介した関数のエクスポートがサポートされているため)、起動後に解釈されたbashコードとして定義されます。ファイルなどで可能です。BASH_FUNC_funcname%%=
export -f
bash
$BASHENV
バッシュ開始ファイル、それらのいくつかはオペレーティングシステムによって提供されるかもしれません、または次のファイルで提供されるかもしれません。bash-completion
第三者プロジェクト使用しているようです。
ただし、zshはサンプル関数または自動ロードとしてロードすることができ、完了(zshの別のプロジェクトではない)、FTP、ラインエディタ、カレンダー、プロンプト設定、文書化など、複数のサブシステムをサポートするための多くの機能を提供します。そして、次のような便利なツールもありますzargs
。zmv
zcalc