ifeq не сравнивает две переменные - PullRequest
0 голосов
/ 20 января 2020

ifeq не сравнивает две переменные

Я создаю программу для перемещения файла на рабочий стол, независимо от языка, выбранного в ОС. На португальском языке папка рабочего стола называется «Área de trabalho». Поскольку «Área de Trabalho» - это три отдельных слова, при написании каталога необходимо добавлять одинарные кавычки («Área de Trabalho»), в противном случае команда приводит к ошибке.

    mv Minesweeper $HOME/Área de Trabalho/  #command

    mv: target 'Trabalho/' is not a directory  #Error

Я использую эта команда для получения каталога папки рабочего стола пользователя:

    xdg-user-dir DESKTOP

И если каталог равен домашнему каталогу плюс "/ Área de Trabalho", я хочу изменить

Вот код:

    desktop=$(shell xdg-user-dir DESKTOP) # I'm using this command to get the directory of the desktop folder of the user
    desktopVar="$$HOME/Área de Trabalho" # And if the directory is equals to the home directory plus "/Área de Trabalho"

    move:
    ifeq (${desktop},${desktopVar})
        desktop=${HOME}/'Área de Trabalho' # I want to change the directory to ${HOME} plus "/'Área de Trabalho'", so the command doesn't results in error
        @echo yes
    endif
        @echo ${desktopVar}
        @echo ${desktop}

Но ifeq говорит, что обе переменные равны и ничего не меняет.

Вот вывод:

    /home/daniel/Área de Trabalho
    /home/daniel/Área de Trabalho

Ответы [ 2 ]

1 голос
/ 20 января 2020

Вот make-файл, который должен работать (нет, действительно, на этот раз :-) Я действительно проверял этот:)

desktop:=$(shell xdg-user-dir DESKTOP)
desktopVar:=${HOME}/Área de Trabalho  #note: using _MAKE_ variable ${HOME} here

$(info desktop:     [${desktop}])
$(info desktopVar:  [${desktopVar}])

    # note: using double quotes around ifeq arguments -- not required
    #       here, but it's good practice:
    # also note: this is not inside of a recipe, so it's done by the
    #            makefile at parse time

ifneq ("${desktop}","${desktopVar}")
$(info changing desktop)
desktop:=${HOME}/Área de Trabalho
endif


$(info desktop:     [${desktop}])
$(info desktopVar:  [${desktopVar}])

all:
        @echo running $@

, который выводит:

scripts> make -f test.mk
desktop:     [/users/foo/Desktop]
desktopVar:  [/users/foo/Área de Trabalho  ]
changing desktop
desktop:     [/users/foo/Área de Trabalho]
desktopVar:  [/users/foo/Área de Trabalho  ]
running all
1 голос
/ 20 января 2020

Двойные кавычки являются частью значения переменной, но они не отображаются в выходных данных, поскольку оболочка их интерпретирует.

desktop = a
desktopVar = "a"

test:
ifeq ($(desktop),$(desktopVar))
    @echo yes
else
    @echo no
endif
    echo $(desktop)
    echo $(desktopVar)

Итак, решение состоит в том, чтобы включить двойные кавычки в определение :

desktop = "$(shell xdg-user-dir DESKTOP)"

Не злоупотребляйте @, когда вы пытаетесь запустить Makefile, он часто помогает при отладке.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...