[120] | 1 | #!/usr/bin/env bash |
---|
| 2 | |
---|
| 3 | # Licensed to the Apache Software Foundation (ASF) under one or more |
---|
| 4 | # contributor license agreements. See the NOTICE file distributed with |
---|
| 5 | # this work for additional information regarding copyright ownership. |
---|
| 6 | # The ASF licenses this file to You under the Apache License, Version 2.0 |
---|
| 7 | # (the "License"); you may not use this file except in compliance with |
---|
| 8 | # the License. You may obtain a copy of the License at |
---|
| 9 | # |
---|
| 10 | # http://www.apache.org/licenses/LICENSE-2.0 |
---|
| 11 | # |
---|
| 12 | # Unless required by applicable law or agreed to in writing, software |
---|
| 13 | # distributed under the License is distributed on an "AS IS" BASIS, |
---|
| 14 | # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
---|
| 15 | # See the License for the specific language governing permissions and |
---|
| 16 | # limitations under the License. |
---|
| 17 | |
---|
| 18 | # Provides tab completion for the main hadoop script. |
---|
| 19 | # |
---|
| 20 | # On debian-based systems, place in /etc/bash_completion.d/ and either restart |
---|
| 21 | # Bash or source the script manually (. /etc/bash_completion.d/hadoop.sh). |
---|
| 22 | |
---|
| 23 | _hadoop() { |
---|
| 24 | local script cur prev temp |
---|
| 25 | |
---|
| 26 | COMPREPLY=() |
---|
| 27 | cur=${COMP_WORDS[COMP_CWORD]} |
---|
| 28 | prev=${COMP_WORDS[COMP_CWORD-1]} |
---|
| 29 | script=${COMP_WORDS[0]} |
---|
| 30 | |
---|
| 31 | # Bash lets you tab complete things even if the script doesn't |
---|
| 32 | # exist (or isn't executable). Check to make sure it is, as we |
---|
| 33 | # need to execute it to get options/info |
---|
| 34 | if [ -f "$script" -a -x "$script" ]; then |
---|
| 35 | case $COMP_CWORD in |
---|
| 36 | 1) |
---|
| 37 | # Completing the first argument (the command). |
---|
| 38 | |
---|
| 39 | temp=`$script | grep -n "^\s*or"`; |
---|
| 40 | temp=`$script | head -n $((${temp%%:*} - 1)) | awk '/^ / {print $1}' | sort | uniq`; |
---|
| 41 | COMPREPLY=(`compgen -W "${temp}" -- ${cur}`); |
---|
| 42 | return 0;; |
---|
| 43 | |
---|
| 44 | 2) |
---|
| 45 | # Completing the second arg (first arg to the command) |
---|
| 46 | |
---|
| 47 | # The output of commands isn't hugely consistent, so certain |
---|
| 48 | # names are hardcoded and parsed differently. Some aren't |
---|
| 49 | # handled at all (mostly ones without args). |
---|
| 50 | case ${COMP_WORDS[1]} in |
---|
| 51 | dfs | dfsadmin | fs | job | pipes) |
---|
| 52 | # One option per line, enclosed in square brackets |
---|
| 53 | |
---|
| 54 | temp=`$script ${COMP_WORDS[1]} 2>&1 | awk '/^[ \t]*\[/ {gsub("[[\\]]", ""); print $1}'`; |
---|
| 55 | COMPREPLY=(`compgen -W "${temp}" -- ${cur}`); |
---|
| 56 | return 0;; |
---|
| 57 | |
---|
| 58 | jar) |
---|
| 59 | # Any (jar) file |
---|
| 60 | |
---|
| 61 | COMPREPLY=(`compgen -A file -- ${cur}`); |
---|
| 62 | return 0;; |
---|
| 63 | |
---|
| 64 | namenode) |
---|
| 65 | # All options specified in one line, |
---|
| 66 | # enclosed in [] and separated with | |
---|
| 67 | temp=`$script ${COMP_WORDS[1]} -help 2>&1 | grep Usage: | cut -d '[' -f 2- | awk '{gsub("] \\| \\[|]", " "); print $0}'`; |
---|
| 68 | COMPREPLY=(`compgen -W "${temp}" -- ${cur}`); |
---|
| 69 | return 0;; |
---|
| 70 | |
---|
| 71 | *) |
---|
| 72 | # Other commands - no idea |
---|
| 73 | |
---|
| 74 | return 1;; |
---|
| 75 | esac;; |
---|
| 76 | |
---|
| 77 | *) |
---|
| 78 | # Additional args |
---|
| 79 | |
---|
| 80 | case ${COMP_WORDS[1]} in |
---|
| 81 | dfs | fs) |
---|
| 82 | # DFS/FS subcommand completion |
---|
| 83 | # Pull the list of options, grep for the one the user is trying to use, |
---|
| 84 | # and then select the description of the relevant argument |
---|
| 85 | temp=$((${COMP_CWORD} - 1)); |
---|
| 86 | temp=`$script ${COMP_WORDS[1]} 2>&1 | grep -- "${COMP_WORDS[2]} " | awk '{gsub("[[ \\]]", ""); print $0}' | cut -d '<' -f ${temp}`; |
---|
| 87 | |
---|
| 88 | if [ ${#temp} -lt 1 ]; then |
---|
| 89 | # No match |
---|
| 90 | return 1; |
---|
| 91 | fi; |
---|
| 92 | |
---|
| 93 | temp=${temp:0:$((${#temp} - 1))}; |
---|
| 94 | |
---|
| 95 | # Now do completion based on the argument |
---|
| 96 | case $temp in |
---|
| 97 | path | src | dst) |
---|
| 98 | # DFS path completion |
---|
| 99 | temp=`$script ${COMP_WORDS[1]} -ls "${cur}*" 2>&1 | grep -vE '^Found ' | cut -f 1 | awk '{gsub("^.* ", ""); print $0;}'` |
---|
| 100 | COMPREPLY=(`compgen -W "${temp}" -- ${cur}`); |
---|
| 101 | return 0;; |
---|
| 102 | |
---|
| 103 | localsrc | localdst) |
---|
| 104 | # Local path completion |
---|
| 105 | COMPREPLY=(`compgen -A file -- ${cur}`); |
---|
| 106 | return 0;; |
---|
| 107 | |
---|
| 108 | *) |
---|
| 109 | # Other arguments - no idea |
---|
| 110 | return 1;; |
---|
| 111 | esac;; |
---|
| 112 | |
---|
| 113 | *) |
---|
| 114 | # Other subcommands - no idea |
---|
| 115 | return 1;; |
---|
| 116 | esac; |
---|
| 117 | esac; |
---|
| 118 | fi; |
---|
| 119 | } |
---|
| 120 | |
---|
| 121 | complete -F _hadoop hadoop |
---|