Sometime it is easier to ssh to a host to obtain the version of an application rather than

to do it from the Finder.


Below is a perl script named  appversion  to do this.


Usage:  appversion MyApp.app MyApp2.app ...


E.g.  appversion Microsoft\ Word.app 

      Microsoft Word.app has version = 16.104



You can download this script from

https://www.cns.nyu.edu/~fan/mydistros/


Place it in  ~/bin  or  /usr/local/bin



# ----------------------------------------------------------------------------------------


#! /usr/bin/perl

# VERSION 1.1

#

# ______________________________________   P Fan -  2/2017, 3/2017, 11/2019

#

# NAME

#

#    appversion <app bundle1> <app bundle2> ...

#

# SYNOPSIS

#    This prints out the version number of the given Apple app(s).

#    It is the value of the key CFBundleShortVersionString  or

#    in some rogue case  CFBundleVersion  in the file

#    <app>/Contents/Info.plist.  It is pretty standard.  We search

#    for the CFBundleShortVersionString key first.

#

#    Presently Info.plist is mostly a text file, but if it happens to be

#    in a binary format, it will be converted to text in /tmp and

#    we search the text version for the relevant key value.  The conversion

#    will require this apple binary plutil.

#

#    One could run this on any unix box as well, but won't be able to get

#    version from binary Info.plist.

#

#  EXAMPLE

#    From inside /Applications, we could do

#    appversion Safari.app,  appversion Utilities/*.app or appversion *.app

#

# ________________________________________________________________



@ARGV > 0 || die "Usage: appversion <app bundle1> <app bundle2> ...\n\n";


print "\n";


foreach $app (@ARGV) {

    # some sanity check first.


    if (!-d "$app") {

    print "I do not see $app\n";

    next;

    }


    $info =    "$app/Contents/Info.plist";

    $infover = "$app/Contents/version.plist";     # old apps may use this


    if (!-e "$info") {

    $info = $infover;    # use version.plist

    }


    if (!-e "$info") {

    print "WARNING: could not see Info.plist nor version.plist - ".

          "no version found\n".

        "Make sure you specify the app bundle and not a parent folder.\n".

       "  Usage: appversion <app bundle1> <app bundle2> ...\n";

    next;

    }


    $tmpf = "";

    $binary = `file "$info" | grep binary`;

    if ($binary ne "") {        # convert plist to text file if not

#    if (!-T $info) {               # convert plist to text file if not

    if (-e "/usr/bin/plutil") {

        chomp ($bapp = `basename "$app"`);    # just the app.

        $tmpf = "/tmp/$bapp.info.plist";

        `cp "$info" "$tmpf"`;

        `plutil -convert xml1 "$tmpf"`;

        $info = $tmpf;

        if (!-T $info) {

         print "Could not convert plist for $app into text - ".

             "no version found\n";

        `rm "$tmpf"`;

        next;

        }

    }

    else {

        print "Could not convert plist for $app into text - ".

              "no version found\n";

        next;

    }

    }



    # Now parse the Info.plist file and look for CFBundleShortVersionString


    open (F, "$info");

   

    $key = "";

    while ($v = <F>) {

    if ($v =~ /\<key\>CFBundleShortVersionString\<\/key\>/) {

        $key = "yes";

          next;

    }

    elsif ($key eq "yes") {

        $v =~ s/\s*\<string\>//;

        $v =~ s/\<\/string\>\s*//;

        print "   $app has version = $v\n";

        last;

    }

    }

      

    close (F);


    if ($key eq "") {

    open (G, "$info");

    }

   

    $key2 = "";

    while ($v = <G>) {

    if ($v =~ /\<key\>CFBundleVersion\<\/key\>/) {

        $key2 = "yes";

          next;

    }

    elsif ($key2 eq "yes") {

        $v =~ s/\s*\<string\>//;

        $v =~ s/\<\/string\>\s*//;

        print "   $app has version = $v\n";

        last;

    }

    }

      

    close (G);


    if ($key eq "" && $key2 eq "") {

        print "Sorry, could not find the app version for $app\n";

    }


    if ($tmpf ne "") {       # clean up possible scratch

    `rm "$tmpf"`;

    }

}


print "\n";