2

Is there a packaged program that shows command line arguments? I often find it helpful to have users run this type of program to either help them understand what their shell commands do, or to get clearer, less ambiguous feedback (e.g. when I can't see their screen and we're communicating online with paste sites).

I've written the below script in Python, which works, but I'd find it easier to tell people a Ubuntu package they can grab rather than explain how write to a file, chmod +x, and change their system (e.g. maybe they don't have ~/bin setup in PATH, ...).

I'd be happy to see a command-line sed/awk/perl/etc. script to do this functionality as well, even if it's ugly. ("If"... doing this in one-line will be ugly.)

Any solution needs to have somewhat similar results to this script; which are, in English: print each argument with a number (escaping problematic characters is just a bonus).

#!/usr/bin/env python2.6
import sys

if len(sys.argv) == 1:
  print "No args!"
else:
  args = enumerate(sys.argv)
  args.next()  # skip program name
  for i, v in args:
    r = repr(v)
    if v.strip() != v or v != r[1:-1]:
      v = r + "\t(repr)"
    print "%3d: %s" % (i, v)
Eric Carvalho
  • 54,385
  • How do you handle concatenated options or optional spaces and such? The way the commandline is parsed is different between applications, so I'm not sure you can have one utility making sense of all of them... – JanC Oct 25 '10 at 19:47
  • @JanC: The goal isn't to parse the arguments into what they mean, but simply to show the shell's tokenization, which can be confusing when using $variables and $(other things). –  Oct 25 '10 at 19:51
  • @JanC: Try var=f\ ee; showargs $(echo "co f") $var, using either my showargs or enzotib's, for example. –  Oct 25 '10 at 19:59
  • 1
    If you only try to illustrate the shell's tokenization after expanding it makes more sense of course. – JanC Oct 25 '10 at 21:19

2 Answers2

1

My solution (you already know ;) as a function (no need to deal with PATH) to become one-liner:

showargs() { i=1; for f; do printf "arg%d: <%s>\n" $i "$f"; ((i++)); done; }
enzotib
  • 93,831
  • Giving you something like this right from the start would've made explaining that other issue easier. Thanks for posting. Still would love to know if there's a package, as I think that would be easiest for explaining command-lines to non-programmer types. –  Oct 25 '10 at 10:03
  • 1
    If there is no package yet, it might be useful to add it to one of the existing packages that contain all sorts of little tools (or create a new one to collect such scripts). – JanC Oct 25 '10 at 21:18
0

This is particularly easy and useful in Bash. This guide at IBM walks through the use of $@, $#, $1, $2, etc. and has a nice testargs.sh script (see listings 7 and 8) that does something like you're looking for: it shows users what arguments and options they've entered.