How can I detect the operating system in Perl?

后端 未结 11 1457
我在风中等你
我在风中等你 2020-12-04 16:41

I have Perl on Mac, Windows and Ubuntu. How can I tell from within the script which one is which? Thanks in advance.

Edit: I was asked what I am doi

相关标签:
11条回答
  • 2020-12-04 17:05

    Look inside the source for File::Spec to see how it loads the right delegate based on the operating system. :)

    File::Spec has a separate Perl module file for each OS. File::Spec::Win32, File::Spec::OS2, etc...

    It checks the operating system and will load the appropriate .pm file at runtime based on OS.

    # From the source code of File::Spec
    my %module = (
          MSWin32 => 'Win32',
          os2     => 'OS2',
          VMS     => 'VMS',
          NetWare => 'Win32', # Yes, File::Spec::Win32 works on NetWare.
          symbian => 'Win32', # Yes, File::Spec::Win32 works on symbian.
          dos     => 'OS2',   # Yes, File::Spec::OS2 works on DJGPP.
          cygwin  => 'Cygwin',
          amigaos => 'AmigaOS');
    
    
    my $module = $module{$^O} || 'Unix';
    
    require "File/Spec/$module.pm";
    our @ISA = ("File::Spec::$module");
    
    0 讨论(0)
  • 2020-12-04 17:06

    The variable $^O (that's a capital 'O', not a zero) holds the name of the operating system.

    Depending on what you want, it may or may not give the answer you want - on my system it gives 'linux' without saying which distro. I'm not so sure about what it says on Windows or MacOS.

    0 讨论(0)
  • 2020-12-04 17:09

    Examine the $^O variable which will contain the name of the operating system:

    print "$^O\n";
    

    Which prints linux on Linux and MSWin32 on Windows.

    You can also refer to this variable by the name $OSNAME if you use the English module:

    use English qw' -no_match_vars ';
    print "$OSNAME\n";
    

    According to perlport, $^O will be darwin on Mac OS X.


    You can also use the Config core module, which can provide the same information (and a lot more):

    use Config;
    
    print "$Config{osname}\n";
    print "$Config{archname}\n";
    

    Which on my Ubuntu machine prints:

    linux
    i486-linux-gnu-thread-multi
    

    Note that this information is based on the system that Perl was built, which is not necessarily the system Perl is currently running on (the same is true for $^O and $OSNAME); the OS won't likely be different but some information, like the architecture name, may very well be.

    0 讨论(0)
  • 2020-12-04 17:11

    Sys::Info::OS looks like a relatively clean potential solution, but currently doesn't seem to support Mac. It shouldn't be too much work to add that though.

    0 讨论(0)
  • 2020-12-04 17:14

    yes using Config module can be a good thing. One more possibility is getting the info from /etc/*release files

    for eg..

    cat /etc/os-release

    NAME="UBUNTU"
    VERSION="12.0.2 LTS, Precise Pangolin"
    ID="UBUNTU"
    ID_LIKE=debian
    PRETTY_NAME="Ubuntu precise (12.0.2 LTS)"
    VERSION_ID="12.04"
    
    0 讨论(0)
提交回复
热议问题