代码之家  ›  专栏  ›  技术社区  ›  Konrad Rudolph

乳胶:我在运行哪个操作系统?

  •  4
  • Konrad Rudolph  · 技术社区  · 15 年前

    我在写一个需要使用的乳胶包 \write18 .我发出的一些shell命令是特定于系统的(例如 rm VS del )是否有方法确定运行的系统?

    这足以消除Windows和其他(类Unix)系统之间的歧义。

    4 回复  |  直到 15 年前
        1
  •  3
  •   Joseph Wright    15 年前

    看一看乳胶ifplatform包。在一系列平台上有很多关于可靠方法的讨论,并且当前的版本工作得很好。

        2
  •  1
  •   Alexey Malistov    15 年前

    不是很好,但对我有用

    \newread\checkf
    \immediate\openin\checkf = C:/WINDOWS/win.ini
    \ifeof\checkf not windows \else windows\fi
    \closein\checkf
    
        3
  •  1
  •   Norman Ramsey    15 年前

    如果你能用一个文件标记你的操作系统,你可以

    \IfFileExists{/etc/motd}{unix code here}{windows code here}
    

    这条路没有什么特别的 /etc/motd ;它很可能在UNIX系统上找到,而不太可能在Windows系统上找到。如果你想完全确定,你应该创建一个文件,专门用你想识别的任何方式来标记系统。

        4
  •  0
  •   Konrad Rudolph    15 年前

    我的一个朋友有以下想法,我现在正在使用。我只在运行良好的Windows XP和OS X上测试过它。诚然,在测试上有点脆弱,但原则上,它几乎可以在任何其他地方正常工作。

    \newif\ifwindows
    
    \immediate\write18{echo $SHELL > \jobname.os}
    \newread\@whichos
    \immediate\openin\@whichos\jobname.os
    \read\@whichos to \@whichosshell
    \ifthenelse{\equal{\@whichosshell}{$SHELL }}
     {\windowstrue}
     {\windowsfalse}
    \closein\@whichos
    
    \ifwindows
      \typeout{System detected: Windows}
      \newcommand\DeleteFile[1]{\immediate\write18{del #1}}
    \else
      \typeout{System detected: Unix-like}
      \newcommand\DeleteFile[1]{\immediate\write18{rm #1}}
    \fi
    % Cleanup.
    \DeleteFile{\jobname.os}
    

    这里的关键是Windows不会扩展 $SHELL 环境变量(任何其他变量都会这样做),因此它将写入字符串 贝壳 从字面上看。