bash命令可以打开一个命令或另一个命令

时间:2015-11-09 18:01:29

标签: linux bash terminal makefile

我正在使用两种不同的操作系统。

  • for MacOS:open file.pdf(它在Mac中的默认pdf程序中打开pdf)
  • for Linux:xdg-open file.pdf(在Linux中这样做)

如果我交换命令它不起作用。 是否有任何单行命令集如:

  • open file.pdf或xdg-open file.pdf

我想要一个适用于它们的命令(或命令),而不会显示任何错误。 我需要此命令的地方是make文件。

我有一个这样的makefile:

all:
open file.pdf
xdg-open file.pdf
other things ..

这里,在makefile中,如何确保make命令在没有运行的情况下运行 Mac和Linux都出错了?

感谢@rubiks,现在代码工作正常。 代码如下所示:

# set pdfviewer for linux and unix machines
####################################################

UNAME_S := $(shell uname -s)

$(info $$UNAME_S == $(UNAME_S))

ifeq ($(UNAME_S),Linux)
PDFVIEWER := xdg-open
else ifeq ($(UNAME_S),Darwin)
PDFVIEWER := open
else

$(error unsupported system: $(UNAME_S))
  endif
$(info $$PDFVIEWER == $(PDFVIEWER))
####################################################
# open the pdf file
default: all
    $(PDFVIEWER) my_pdf_filename.pdf    

3 个答案:

答案 0 :(得分:7)

我认为最好更智能地执行此操作并确定您所使用的操作系统:

if [ `uname` == "Darwin" ]; then
  open file.pdf
else
  xdg-open file.pdf 
fi

如果您尝试配置终端以便始终可以使用相同的命令,我建议您将其添加到.bashrc或.bash_profile:

if [ `uname` == "Linux" ]; then
   alias open=xdg-open
fi

这样,您始终可以使用命令open,它可以在任何一个操作系统上运行。

答案 1 :(得分:1)

如果您不介意调用shell,可以在Makefile内查询系统并相应地设置PDFVIEWER

UNAME_S := $(shell uname -s)

$(info $$UNAME_S == $(UNAME_S))

ifeq ($(UNAME_S),Linux)
  PDFVIEWER := xdg-open
else ifeq ($(UNAME_S),Darwin)
  PDFVIEWER := open
else
  $(error unsupported system: $(UNAME_S))
endif

$(info $$PDFVIEWER == $(PDFVIEWER))            

答案 2 :(得分:0)

您可以尝试使用which返回第一个可用的可执行文件,例如

open  := $(shell which open xdg-open | head -n1)
xargs := $(shell which gxargs xargs  | head -n1) # Another example.

然后将其运行为:

$open file.pdf