docker 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873
  1. #!/bin/bash
  2. #
  3. # bash completion file for core docker commands
  4. #
  5. # This script provides completion of:
  6. # - commands and their options
  7. # - container ids and names
  8. # - image repos and tags
  9. # - filepaths
  10. #
  11. # To enable the completions either:
  12. # - place this file in /etc/bash_completion.d
  13. # or
  14. # - copy this file to e.g. ~/.docker-completion.sh and add the line
  15. # below to your .bashrc after bash completion features are loaded
  16. # . ~/.docker-completion.sh
  17. #
  18. # Note:
  19. # Currently, the completions will not work if the docker daemon is not
  20. # bound to the default communication port/socket
  21. # If the docker daemon is using a unix socket for communication your user
  22. # must have access to the socket for the completions to function correctly
  23. #
  24. # Note for developers:
  25. # Please arrange options sorted alphabetically by long name with the short
  26. # options immediately following their corresponding long form.
  27. # This order should be applied to lists, alternatives and code blocks.
  28. __docker_q() {
  29. docker 2>/dev/null "$@"
  30. }
  31. __docker_containers_all() {
  32. local IFS=$'\n'
  33. local containers=( $(__docker_q ps -aq --no-trunc) )
  34. if [ "$1" ]; then
  35. containers=( $(__docker_q inspect --format "{{if $1}}{{.Id}}{{end}}" "${containers[@]}") )
  36. fi
  37. local names=( $(__docker_q inspect --format '{{.Name}}' "${containers[@]}") )
  38. names=( "${names[@]#/}" ) # trim off the leading "/" from the container names
  39. unset IFS
  40. COMPREPLY=( $(compgen -W "${names[*]} ${containers[*]}" -- "$cur") )
  41. }
  42. __docker_containers_running() {
  43. __docker_containers_all '.State.Running'
  44. }
  45. __docker_containers_stopped() {
  46. __docker_containers_all 'not .State.Running'
  47. }
  48. __docker_containers_pauseable() {
  49. __docker_containers_all 'and .State.Running (not .State.Paused)'
  50. }
  51. __docker_containers_unpauseable() {
  52. __docker_containers_all '.State.Paused'
  53. }
  54. __docker_image_repos() {
  55. local repos="$(__docker_q images | awk 'NR>1 && $1 != "<none>" { print $1 }')"
  56. COMPREPLY=( $(compgen -W "$repos" -- "$cur") )
  57. }
  58. __docker_image_repos_and_tags() {
  59. local reposAndTags="$(__docker_q images | awk 'NR>1 && $1 != "<none>" { print $1; print $1":"$2 }')"
  60. COMPREPLY=( $(compgen -W "$reposAndTags" -- "$cur") )
  61. __ltrim_colon_completions "$cur"
  62. }
  63. __docker_image_repos_and_tags_and_ids() {
  64. local images="$(__docker_q images -a --no-trunc | awk 'NR>1 { print $3; if ($1 != "<none>") { print $1; print $1":"$2 } }')"
  65. COMPREPLY=( $(compgen -W "$images" -- "$cur") )
  66. __ltrim_colon_completions "$cur"
  67. }
  68. __docker_containers_and_images() {
  69. __docker_containers_all
  70. local containers=( "${COMPREPLY[@]}" )
  71. __docker_image_repos_and_tags_and_ids
  72. COMPREPLY+=( "${containers[@]}" )
  73. }
  74. __docker_pos_first_nonflag() {
  75. local argument_flags=$1
  76. local counter=$cpos
  77. while [ $counter -le $cword ]; do
  78. if [ -n "$argument_flags" ] && eval "case '${words[$counter]}' in $argument_flags) true ;; *) false ;; esac"; then
  79. (( counter++ ))
  80. else
  81. case "${words[$counter]}" in
  82. -*)
  83. ;;
  84. *)
  85. break
  86. ;;
  87. esac
  88. fi
  89. (( counter++ ))
  90. done
  91. echo $counter
  92. }
  93. __docker_resolve_hostname() {
  94. command -v host >/dev/null 2>&1 || return
  95. COMPREPLY=( $(host 2>/dev/null "${cur%:}" | awk '/has address/ {print $4}') )
  96. }
  97. __docker_capabilities() {
  98. # The list of capabilities is defined in types.go, ALL was added manually.
  99. COMPREPLY=( $( compgen -W "
  100. ALL
  101. AUDIT_CONTROL
  102. AUDIT_WRITE
  103. BLOCK_SUSPEND
  104. CHOWN
  105. DAC_OVERRIDE
  106. DAC_READ_SEARCH
  107. FOWNER
  108. FSETID
  109. IPC_LOCK
  110. IPC_OWNER
  111. KILL
  112. LEASE
  113. LINUX_IMMUTABLE
  114. MAC_ADMIN
  115. MAC_OVERRIDE
  116. MKNOD
  117. NET_ADMIN
  118. NET_BIND_SERVICE
  119. NET_BROADCAST
  120. NET_RAW
  121. SETFCAP
  122. SETGID
  123. SETPCAP
  124. SETUID
  125. SYS_ADMIN
  126. SYS_BOOT
  127. SYS_CHROOT
  128. SYSLOG
  129. SYS_MODULE
  130. SYS_NICE
  131. SYS_PACCT
  132. SYS_PTRACE
  133. SYS_RAWIO
  134. SYS_RESOURCE
  135. SYS_TIME
  136. SYS_TTY_CONFIG
  137. WAKE_ALARM
  138. " -- "$cur" ) )
  139. }
  140. _docker_docker() {
  141. case "$prev" in
  142. -H)
  143. return
  144. ;;
  145. esac
  146. case "$cur" in
  147. -*)
  148. COMPREPLY=( $( compgen -W "-H" -- "$cur" ) )
  149. ;;
  150. *)
  151. COMPREPLY=( $( compgen -W "${commands[*]} help" -- "$cur" ) )
  152. ;;
  153. esac
  154. }
  155. _docker_attach() {
  156. case "$cur" in
  157. -*)
  158. COMPREPLY=( $( compgen -W "--no-stdin --sig-proxy" -- "$cur" ) )
  159. ;;
  160. *)
  161. local counter="$(__docker_pos_first_nonflag)"
  162. if [ $cword -eq $counter ]; then
  163. __docker_containers_running
  164. fi
  165. ;;
  166. esac
  167. }
  168. _docker_build() {
  169. case "$prev" in
  170. --tag|-t)
  171. __docker_image_repos_and_tags
  172. return
  173. ;;
  174. esac
  175. case "$cur" in
  176. -*)
  177. COMPREPLY=( $( compgen -W "--force-rm --no-cache --quiet -q --rm --tag -t" -- "$cur" ) )
  178. ;;
  179. *)
  180. local counter="$(__docker_pos_first_nonflag '--tag|-t')"
  181. if [ $cword -eq $counter ]; then
  182. _filedir -d
  183. fi
  184. ;;
  185. esac
  186. }
  187. _docker_commit() {
  188. case "$prev" in
  189. --author|-a|--message|-m|--run)
  190. return
  191. ;;
  192. esac
  193. case "$cur" in
  194. -*)
  195. COMPREPLY=( $( compgen -W "--author -a --message -m --run" -- "$cur" ) )
  196. ;;
  197. *)
  198. local counter=$(__docker_pos_first_nonflag '--author|-a|--message|-m|--run')
  199. if [ $cword -eq $counter ]; then
  200. __docker_containers_all
  201. return
  202. fi
  203. (( counter++ ))
  204. if [ $cword -eq $counter ]; then
  205. __docker_image_repos_and_tags
  206. return
  207. fi
  208. ;;
  209. esac
  210. }
  211. _docker_cp() {
  212. local counter=$(__docker_pos_first_nonflag)
  213. if [ $cword -eq $counter ]; then
  214. case "$cur" in
  215. *:)
  216. return
  217. ;;
  218. *)
  219. __docker_containers_all
  220. COMPREPLY=( $( compgen -W "${COMPREPLY[*]}" -S ':' ) )
  221. compopt -o nospace
  222. return
  223. ;;
  224. esac
  225. fi
  226. (( counter++ ))
  227. if [ $cword -eq $counter ]; then
  228. _filedir
  229. return
  230. fi
  231. }
  232. _docker_create() {
  233. _docker_run
  234. }
  235. _docker_diff() {
  236. local counter=$(__docker_pos_first_nonflag)
  237. if [ $cword -eq $counter ]; then
  238. __docker_containers_all
  239. fi
  240. }
  241. _docker_events() {
  242. case "$prev" in
  243. --since)
  244. return
  245. ;;
  246. esac
  247. case "$cur" in
  248. -*)
  249. COMPREPLY=( $( compgen -W "--since" -- "$cur" ) )
  250. ;;
  251. esac
  252. }
  253. _docker_exec() {
  254. case "$cur" in
  255. -*)
  256. COMPREPLY=( $( compgen -W "--detach -d --interactive -i -t --tty" -- "$cur" ) )
  257. ;;
  258. *)
  259. __docker_containers_running
  260. ;;
  261. esac
  262. }
  263. _docker_export() {
  264. local counter=$(__docker_pos_first_nonflag)
  265. if [ $cword -eq $counter ]; then
  266. __docker_containers_all
  267. fi
  268. }
  269. _docker_help() {
  270. local counter=$(__docker_pos_first_nonflag)
  271. if [ $cword -eq $counter ]; then
  272. COMPREPLY=( $( compgen -W "${commands[*]}" -- "$cur" ) )
  273. fi
  274. }
  275. _docker_history() {
  276. case "$cur" in
  277. -*)
  278. COMPREPLY=( $( compgen -W "--no-trunc --quiet -q" -- "$cur" ) )
  279. ;;
  280. *)
  281. local counter=$(__docker_pos_first_nonflag)
  282. if [ $cword -eq $counter ]; then
  283. __docker_image_repos_and_tags_and_ids
  284. fi
  285. ;;
  286. esac
  287. }
  288. _docker_images() {
  289. case "$cur" in
  290. -*)
  291. COMPREPLY=( $( compgen -W "--all -a --no-trunc --quiet -q" -- "$cur" ) )
  292. ;;
  293. *)
  294. local counter=$(__docker_pos_first_nonflag)
  295. if [ $cword -eq $counter ]; then
  296. __docker_image_repos
  297. fi
  298. ;;
  299. esac
  300. }
  301. _docker_import() {
  302. local counter=$(__docker_pos_first_nonflag)
  303. if [ $cword -eq $counter ]; then
  304. return
  305. fi
  306. (( counter++ ))
  307. if [ $cword -eq $counter ]; then
  308. __docker_image_repos_and_tags
  309. return
  310. fi
  311. }
  312. _docker_info() {
  313. return
  314. }
  315. _docker_inspect() {
  316. case "$prev" in
  317. --format|-f)
  318. return
  319. ;;
  320. esac
  321. case "$cur" in
  322. -*)
  323. COMPREPLY=( $( compgen -W "--format -f" -- "$cur" ) )
  324. ;;
  325. *)
  326. __docker_containers_and_images
  327. ;;
  328. esac
  329. }
  330. _docker_kill() {
  331. __docker_containers_running
  332. }
  333. _docker_load() {
  334. case "$prev" in
  335. --input|-i)
  336. _filedir
  337. return
  338. ;;
  339. esac
  340. case "$cur" in
  341. -*)
  342. COMPREPLY=( $( compgen -W "--input -i" -- "$cur" ) )
  343. ;;
  344. esac
  345. }
  346. _docker_login() {
  347. case "$prev" in
  348. --email|-e|--password|-p|--username|-u)
  349. return
  350. ;;
  351. esac
  352. case "$cur" in
  353. -*)
  354. COMPREPLY=( $( compgen -W "--email -e --password -p --username -u" -- "$cur" ) )
  355. ;;
  356. esac
  357. }
  358. _docker_logs() {
  359. case "$cur" in
  360. -*)
  361. COMPREPLY=( $( compgen -W "--follow -f" -- "$cur" ) )
  362. ;;
  363. *)
  364. local counter=$(__docker_pos_first_nonflag)
  365. if [ $cword -eq $counter ]; then
  366. __docker_containers_all
  367. fi
  368. ;;
  369. esac
  370. }
  371. _docker_pause() {
  372. local counter=$(__docker_pos_first_nonflag)
  373. if [ $cword -eq $counter ]; then
  374. __docker_containers_pauseable
  375. fi
  376. }
  377. _docker_port() {
  378. local counter=$(__docker_pos_first_nonflag)
  379. if [ $cword -eq $counter ]; then
  380. __docker_containers_all
  381. fi
  382. }
  383. _docker_ps() {
  384. case "$prev" in
  385. --before|--since)
  386. __docker_containers_all
  387. ;;
  388. -n)
  389. return
  390. ;;
  391. esac
  392. case "$cur" in
  393. -*)
  394. COMPREPLY=( $( compgen -W "--all -a --before --latest -l --no-trunc -n --quiet -q --size -s --since" -- "$cur" ) )
  395. ;;
  396. esac
  397. }
  398. _docker_pull() {
  399. case "$prev" in
  400. --tag|-t)
  401. return
  402. ;;
  403. esac
  404. case "$cur" in
  405. -*)
  406. COMPREPLY=( $( compgen -W "--tag -t" -- "$cur" ) )
  407. ;;
  408. *)
  409. local counter=$(__docker_pos_first_nonflag '--tag|-t')
  410. if [ $cword -eq $counter ]; then
  411. __docker_image_repos_and_tags
  412. fi
  413. ;;
  414. esac
  415. }
  416. _docker_push() {
  417. local counter=$(__docker_pos_first_nonflag)
  418. if [ $cword -eq $counter ]; then
  419. __docker_image_repos_and_tags
  420. fi
  421. }
  422. _docker_restart() {
  423. case "$prev" in
  424. --time|-t)
  425. return
  426. ;;
  427. esac
  428. case "$cur" in
  429. -*)
  430. COMPREPLY=( $( compgen -W "--time -t" -- "$cur" ) )
  431. ;;
  432. *)
  433. __docker_containers_all
  434. ;;
  435. esac
  436. }
  437. _docker_rm() {
  438. case "$cur" in
  439. -*)
  440. COMPREPLY=( $( compgen -W "--force -f --link -l --volumes -v" -- "$cur" ) )
  441. return
  442. ;;
  443. *)
  444. for arg in "${COMP_WORDS[@]}"; do
  445. case "$arg" in
  446. --force|-f)
  447. __docker_containers_all
  448. return
  449. ;;
  450. esac
  451. done
  452. __docker_containers_stopped
  453. return
  454. ;;
  455. esac
  456. }
  457. _docker_rmi() {
  458. __docker_image_repos_and_tags_and_ids
  459. }
  460. _docker_run() {
  461. local options_with_args="
  462. --add-host
  463. --attach -a
  464. --cap-add
  465. --cap-drop
  466. --cidfile
  467. --cpuset
  468. --cpu-shares -c
  469. --device
  470. --dns
  471. --dns-search
  472. --entrypoint
  473. --env -e
  474. --env-file
  475. --expose
  476. --hostname -h
  477. --ipc
  478. --link
  479. --lxc-conf
  480. --mac-address
  481. --memory -m
  482. --name
  483. --net
  484. --publish -p
  485. --restart
  486. --security-opt
  487. --user -u
  488. --volumes-from
  489. --volume -v
  490. --workdir -w
  491. "
  492. local all_options="$options_with_args
  493. --interactive -i
  494. --privileged
  495. --publish-all -P
  496. --tty -t
  497. "
  498. [ "$command" = "run" ] && all_options="$all_options
  499. --detach -d
  500. --rm
  501. --sig-proxy
  502. "
  503. case "$prev" in
  504. --add-host)
  505. case "$cur" in
  506. *:)
  507. __docker_resolve_hostname
  508. return
  509. ;;
  510. esac
  511. ;;
  512. --attach|-a)
  513. COMPREPLY=( $( compgen -W 'stdin stdout stderr' -- "$cur" ) )
  514. return
  515. ;;
  516. --cap-add|--cap-drop)
  517. __docker_capabilities
  518. return
  519. ;;
  520. --cidfile|--env-file)
  521. _filedir
  522. return
  523. ;;
  524. --device|-d|--volume)
  525. case "$cur" in
  526. *:*)
  527. # TODO somehow do _filedir for stuff inside the image, if it's already specified (which is also somewhat difficult to determine)
  528. ;;
  529. '')
  530. COMPREPLY=( $( compgen -W '/' -- "$cur" ) )
  531. compopt -o nospace
  532. ;;
  533. /*)
  534. _filedir
  535. compopt -o nospace
  536. ;;
  537. esac
  538. return
  539. ;;
  540. --env|-e)
  541. COMPREPLY=( $( compgen -e -- "$cur" ) )
  542. compopt -o nospace
  543. return
  544. ;;
  545. --ipc)
  546. case "$cur" in
  547. *:*)
  548. cur="${cur#*:}"
  549. __docker_containers_running
  550. ;;
  551. *)
  552. COMPREPLY=( $( compgen -W 'host container:' -- "$cur" ) )
  553. if [ "$COMPREPLY" = "container:" ]; then
  554. compopt -o nospace
  555. fi
  556. ;;
  557. esac
  558. return
  559. ;;
  560. --link)
  561. case "$cur" in
  562. *:*)
  563. ;;
  564. *)
  565. __docker_containers_running
  566. COMPREPLY=( $( compgen -W "${COMPREPLY[*]}" -S ':' ) )
  567. compopt -o nospace
  568. ;;
  569. esac
  570. return
  571. ;;
  572. --net)
  573. case "$cur" in
  574. container:*)
  575. local cur=${cur#*:}
  576. __docker_containers_all
  577. ;;
  578. *)
  579. COMPREPLY=( $( compgen -W "bridge none container: host" -- "$cur") )
  580. if [ "${COMPREPLY[*]}" = "container:" ] ; then
  581. compopt -o nospace
  582. fi
  583. ;;
  584. esac
  585. return
  586. ;;
  587. --restart)
  588. case "$cur" in
  589. on-failure:*)
  590. ;;
  591. *)
  592. COMPREPLY=( $( compgen -W "no on-failure on-failure: always" -- "$cur") )
  593. ;;
  594. esac
  595. return
  596. ;;
  597. --security-opt)
  598. case "$cur" in
  599. label:*:*)
  600. ;;
  601. label:*)
  602. local cur=${cur##*:}
  603. COMPREPLY=( $( compgen -W "user: role: type: level: disable" -- "$cur") )
  604. if [ "${COMPREPLY[*]}" != "disable" ] ; then
  605. compopt -o nospace
  606. fi
  607. ;;
  608. *)
  609. COMPREPLY=( $( compgen -W "label apparmor" -S ":" -- "$cur") )
  610. compopt -o nospace
  611. ;;
  612. esac
  613. return
  614. ;;
  615. --volumes-from)
  616. __docker_containers_all
  617. return
  618. ;;
  619. --cpuset|--cpu-shares|-c|--dns|--dns-search|--entrypoint|--expose|--hostname|-h|--lxc-conf|--mac-address|--memory|-m|--name|-n|--publish|-p|--user|-u|--workdir|-w)
  620. return
  621. ;;
  622. esac
  623. case "$cur" in
  624. -*)
  625. COMPREPLY=( $( compgen -W "$all_options" -- "$cur" ) )
  626. ;;
  627. *)
  628. local counter=$( __docker_pos_first_nonflag $( echo $options_with_args | tr -d "\n" | tr " " "|" ) )
  629. if [ $cword -eq $counter ]; then
  630. __docker_image_repos_and_tags_and_ids
  631. fi
  632. ;;
  633. esac
  634. }
  635. _docker_save() {
  636. case "$prev" in
  637. --output|-o)
  638. _filedir
  639. return
  640. ;;
  641. esac
  642. case "$cur" in
  643. -*)
  644. COMPREPLY=( $( compgen -W "-o --output" -- "$cur" ) )
  645. ;;
  646. *)
  647. __docker_image_repos_and_tags_and_ids
  648. ;;
  649. esac
  650. }
  651. _docker_search() {
  652. case "$prev" in
  653. --stars|-s)
  654. return
  655. ;;
  656. esac
  657. case "$cur" in
  658. -*)
  659. COMPREPLY=( $( compgen -W "--automated --no-trunc --stars -s" -- "$cur" ) )
  660. ;;
  661. esac
  662. }
  663. _docker_start() {
  664. case "$cur" in
  665. -*)
  666. COMPREPLY=( $( compgen -W "--attach -a --interactive -i" -- "$cur" ) )
  667. ;;
  668. *)
  669. __docker_containers_stopped
  670. ;;
  671. esac
  672. }
  673. _docker_stop() {
  674. case "$prev" in
  675. --time|-t)
  676. return
  677. ;;
  678. esac
  679. case "$cur" in
  680. -*)
  681. COMPREPLY=( $( compgen -W "--time -t" -- "$cur" ) )
  682. ;;
  683. *)
  684. __docker_containers_running
  685. ;;
  686. esac
  687. }
  688. _docker_tag() {
  689. case "$cur" in
  690. -*)
  691. COMPREPLY=( $( compgen -W "--force -f" -- "$cur" ) )
  692. ;;
  693. *)
  694. local counter=$(__docker_pos_first_nonflag)
  695. if [ $cword -eq $counter ]; then
  696. __docker_image_repos_and_tags
  697. return
  698. fi
  699. (( counter++ ))
  700. if [ $cword -eq $counter ]; then
  701. __docker_image_repos_and_tags
  702. return
  703. fi
  704. ;;
  705. esac
  706. }
  707. _docker_unpause() {
  708. local counter=$(__docker_pos_first_nonflag)
  709. if [ $cword -eq $counter ]; then
  710. __docker_containers_unpauseable
  711. fi
  712. }
  713. _docker_top() {
  714. local counter=$(__docker_pos_first_nonflag)
  715. if [ $cword -eq $counter ]; then
  716. __docker_containers_running
  717. fi
  718. }
  719. _docker_version() {
  720. return
  721. }
  722. _docker_wait() {
  723. __docker_containers_all
  724. }
  725. _docker() {
  726. local commands=(
  727. attach
  728. build
  729. commit
  730. cp
  731. create
  732. diff
  733. events
  734. exec
  735. export
  736. history
  737. images
  738. import
  739. info
  740. insert
  741. inspect
  742. kill
  743. load
  744. login
  745. logs
  746. pause
  747. port
  748. ps
  749. pull
  750. push
  751. restart
  752. rm
  753. rmi
  754. run
  755. save
  756. search
  757. start
  758. stop
  759. tag
  760. top
  761. unpause
  762. version
  763. wait
  764. )
  765. COMPREPLY=()
  766. local cur prev words cword
  767. _get_comp_words_by_ref -n : cur prev words cword
  768. local command='docker' cpos=0
  769. local counter=1
  770. while [ $counter -lt $cword ]; do
  771. case "${words[$counter]}" in
  772. -H)
  773. (( counter++ ))
  774. ;;
  775. -*)
  776. ;;
  777. *)
  778. command="${words[$counter]}"
  779. cpos=$counter
  780. (( cpos++ ))
  781. break
  782. ;;
  783. esac
  784. (( counter++ ))
  785. done
  786. local completions_func=_docker_${command}
  787. declare -F $completions_func >/dev/null && $completions_func
  788. return 0
  789. }
  790. complete -F _docker docker