Использование сценария оболочки -> получение ошибки - PullRequest
0 голосов
/ 05 октября 2011

Я писал сценарий оболочки так, чтобы мне не приходилось каждый раз давать одинаковые параметры clang, когда я пытаюсь скомпилировать файл ac ... (используя Sublime и пытаясь собрать и запустить ...

#!/bin/bash
cd "$(dirname "$1")"
clang "-Wall $(basename "$1") -o $(basename "$1" ".${1##*.}")"

Я совершаю действительно глупую ошибку? Или это возможно?

И если я хочу, чтобы она сразу запустилась, я должен удалить -o?

Келан

Ответы [ 3 ]

2 голосов
/ 05 октября 2011

все в двойных кавычках является одним параметром, поэтому ...:

clang -Wall "$(basename "$1")" -o "$(basename "$1" ".${1##*.}")"
0 голосов
/ 05 октября 2011

Поясню на одном примере.Это что-то приемлемое:

a=getAnum(randomize(10*(34)))

И вот что вы сделали:

a=getAnum(randomize)10*(34)()

Ваши кавычки выступают в качестве скобок во второй строке кода.Вот почему мы обычно используем одинарные кавычки, когда хотим вложить что-то между двойными кавычками в большинстве языков программирования, например: «Я съел« пиццу »и« тунец »». Чтобы получить строку: I ate 'pizza' and 'tuna'

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

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

cd "$(dirname "$1")"

становится так:

cd $(dirname "$1")

или вот это:

cd $(dirname $1)

однако это:

cd '$(dirname $1)'

Или это:

cd $(dirname '$1')

не будет работать.Было бы взять все между одинарными кавычками и интерпретировать это как текст.Таким образом, в первом случае он попытается ввести каталог с именем $ (dirname $ 1) , а во втором имени он будет запускать dirname $ 1 .

0 голосов
/ 05 октября 2011

Попробуйте, просто так:

#!/bin/bash
if [ "$1" ] ; then
    cd "$(dirname "$1")"
    clang -Wall "$(basename "$1")" -o "$(basename "${1%%.c}")"
fi

Если вы планируете компилировать больше файлов, начните использовать Makefiles.

...