/ contrib / completions / bash / bitcoin.bash
bitcoin.bash
  1  # bash programmable completion for bitcoin(1) wrapper
  2  # Copyright (c) 2026-present The Bitcoin Core developers
  3  # Distributed under the MIT software license, see the accompanying
  4  # file COPYING or http://www.opensource.org/licenses/mit-license.php.
  5  
  6  # wrapper to delegate completion to the real function
  7  _bitcoin_wrap() {
  8      local delegate="$1" shift_count="$2"
  9      local func="_${delegate//-/_}"
 10      local words cword dir file
 11  
 12      # load completion script if function not yet defined
 13      if ! declare -F $func >/dev/null; then
 14          dir="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
 15          file="$(grep -l -E "complete[[:space:]]+-F[[:space:]]+${func}" "$dir"/* 2>/dev/null | head -n1)"
 16          [ -z "$file" ] && file="$(grep -l -E "^[[:space:]]*${func}[[:space:]]*\(\)" "$dir"/* 2>/dev/null | head -n1)"
 17          [ -n "$file" ] && source "$file" || return 0
 18      fi
 19  
 20      _get_comp_words_by_ref -n = words cword
 21  
 22      COMP_WORDS=( "$delegate" "${words[@]:$shift_count}" )
 23      COMP_CWORD=$(( cword - (shift_count - 1) ))
 24      COMP_LINE="${COMP_WORDS[@]}"
 25      COMP_POINT=${#COMP_LINE}
 26      $func "$delegate"
 27  }
 28  
 29  _bitcoin() {
 30      local cur prev words cword
 31      local bitcoin subcmd offset
 32  
 33      # save and use original argument to invoke bitcoin for help
 34      # it might not be in $PATH
 35      bitcoin="$1"
 36  
 37      COMPREPLY=()
 38      _get_comp_words_by_ref -n = cur prev words cword
 39  
 40      case "${words[1]}" in
 41          -m|-M|--multiprocess|--monolithic)
 42              subcmd="${words[2]}"
 43              offset=3
 44              ;;
 45          *)
 46              subcmd="${words[1]}"
 47              offset=2
 48              ;;
 49      esac
 50  
 51      case "$subcmd" in
 52          gui|node)
 53              _bitcoin_wrap bitcoind "$offset"
 54              return 0
 55              ;;
 56          rpc)
 57              _bitcoin_wrap bitcoin-cli "$offset"
 58              return 0
 59              ;;
 60          tx)
 61              _bitcoin_wrap bitcoin-tx "$offset"
 62              return 0
 63              ;;
 64      esac
 65  
 66      case "$cur" in
 67          -*=*)   # prevent nonsense completions
 68              return 0
 69              ;;
 70          *)
 71              local options commands
 72  
 73              # only parse help if sensible
 74              if [[ -z "$cur" || "$cur" =~ ^- ]]; then
 75                  options=$($bitcoin help 2>&1 | awk '{ for(i=1;i<=NF;i++) if ($i~/^--/) { sub(/=.*/, "=",$i); print $i } }' )
 76              fi
 77              if [[ -z "$cur" || "$cur" =~ ^[a-z] ]]; then
 78                  commands=$($bitcoin help 2>/dev/null | awk '$1 ~ /^[a-z]/ { print $1; }')
 79              fi
 80  
 81              COMPREPLY=( $( compgen -W "$options $commands" -- "$cur" ) )
 82  
 83              # Prevent space if an argument is desired
 84              if [[ $COMPREPLY == *= ]]; then
 85                  compopt -o nospace
 86              fi
 87              return 0
 88              ;;
 89      esac
 90  
 91  } &&
 92  complete -F _bitcoin bitcoin
 93  
 94  # Local variables:
 95  # mode: shell-script
 96  # sh-basic-offset: 4
 97  # sh-indent-comment: t
 98  # indent-tabs-mode: nil
 99  # End:
100  # ex: ts=4 sw=4 et filetype=sh