Adding persistent flags
At this point, we have multiple levels of commands. What if we want a common
flag across all levels of subcommands? Let's implement a --show-inputs flag that
prints our inputs like so:
# math arithmetic sum --show-inputs 1 2
1+2=3
# math arithmetic subtract --show-inputs 1 2
1-2=-1
We could add this flag as a BoolP to both the subtractCmd and the sumCmd,
but we should instead bind it to the arithmeticCmd as a PersistentFlag.
If you still have the comments scaffolded in the init() func by cobra-cli
for the cmd/arithmetic.go file, you might see this line here:
func init() {
// ... omitted
// arithmeticCmd.PersistentFlags().String("foo", "", "A help for foo")
// ... omitted
}
A PersistentFlag is one that is passed along to child subcommands. Whereas a
Flag on arithmeticCmd would not be passed down to sumCmd or
subtractCmd, a PersistentFlag is made available to both of them.
Uncomment this line and make it a BoolP flag called show-inputs, with
shortflag s. Note: Making this a BoolP may require adding a parameter to the
function call!
// ... the rest of the code
func init() {
rootCmd.AddCommand(arithmeticCmd)
arithmeticCmd.PersistentFlags().BoolP("show-inputs", "s", false, "whether to print inputs")
}
Build and run math arithmetic to see the flag is now configured.
$ go build . && ./math arithmetic --help
basic arithmetic functions
Usage:
math arithmetic [command]
Available Commands:
subtract subtract integers
Flags:
-h, --help help for arithmetic
-s, --show-inputs whether to print inputs # here it is!
Use "math arithmetic [command] --help" for more information about a command.
Run the math arithmetic subtract command with the --help flag to see it
listed there as a Global Flag:
$ go build . && ./math arithmetic subtract --help
subtract integers
Usage:
math arithmetic subtract [flags]
Flags:
-h, --help help for subtract
-i, --invert-sign inverts the sign of the result.
Global Flags:
-s, --show-inputs whether to print inputs
If you run just the math command, you'll notice that the flag is missing!
$ go build . && ./math --help
Execute fun math functions
Usage:
math [command]
Available Commands:
arithmetic basic arithmetic functions
completion Generate the autocompletion script for the specified shell
help Help about any command
Flags:
-h, --help help for math
-t, --toggle Help message for toggle
Use "math [command] --help" for more information about a command.
So the flag is available at subcommands below where it is defined as shown here:

Accessing the persistent flag declared in the arithmeticCmd has a bit of a trick to it!
When accessing the value from the sumCommandRunE, for example, we will still
call cmd.Flags() and NOT cmd.PersistentFlags(). This is because
cmd.PersistentFlags() only returns that specific command's persistent flags.
To see all flags that apply to the command you are developing, you only need to
call cmd.Flags().
func sumCommandRunE(cmd *cobra.Command, args []string) error { // return an error
// .. this code is unchanged ..
showInputs, _ := cmd.Flags().GetBool("show-inputs")
if showInputs {
fmt.Fprintf(cmd.OutOrStdout(), "%s\n", strings.Join(args, "+"))
}
fmt.Fprintln(cmd.OutOrStdout(), sum(values...))
return nil
}
We see this output after we build and run the new math binary:
$ go build . && ./math arithmetic sum --show-inputs 2 3
Command "sum" is deprecated, This command will be replaced by the "addition" command in the next release
2+3
5