Моя программа не может работать с & ldquo; команда не найдена & rdquo; ошибка

Если:

cat file
a
b
c
d
e
f match
g
h
i match
j
k
l
m
n
o

Затем:

awk '
    {line[NR] = $0} 
    /match/ {matched[NR]} 
    END {
        for (nr in matched)
            for (n=nr-5; n<=nr+5; n+=5) 
                print line[n]
    }
' file
a
f match
k
d
i match
n
15
задан 7 March 2012 в 20:14

4 ответа

Поскольку вы запускаете исполняемый файл в текущем рабочем каталоге, вы должны префикс его с помощью ./. Поэтому для вашей программы запустите ее как ./a.out.

Объяснение

Терминал выполняет поиск исполняемых файлов в $PATH. Это переменная среды Unix, в которой перечислены каталоги, содержащие системные двоичные файлы (например, ls, echo или gcc). Если вы вызываете исполняемый файл, который не находится в каталоге $PATH (например, a.out), вам нужно указать его абсолютный путь в файловой системе.

В терминале . используется синоним текущий рабочий каталог, таким образом ./a.out. Вы также можете назвать /home/yihang/Documents/a.out.

29
ответ дан 25 May 2018 в 13:41
  • 1
    Чтобы дополнительно уточнить это, "./" служит командой «прямо здесь», командой. Это немного избыточно, но полезно в том смысле, что вы знаете, что будете что-то выполнять. – Ruben Bakker 7 March 2012 в 18:04
  • 2
    Вам также может понадобиться chmod u+x a.out, чтобы позволить системе выполнить его. – charlesbridge 7 March 2012 в 18:13
  • 3
    Теперь я получаю его с помощью ./& quot ;. Программа отлично работает без chmod. Благодарю. – yihangho 7 March 2012 в 19:44
  • 4
    @yihang: Пожалуйста, подумайте над тем, чтобы отметить этот вопрос в ответ, щелкнув серый / зеленый круг в левой части ответа, который вам больше всего нравится. – Rafał Cieślak 8 March 2012 в 19:37
  • 5
    @Ruben Bakker: На самом деле, это вовсе не избыточно. В отличие от Windows, Linux не выполняет поиск по умолчанию в текущем каталоге или по умолчанию. Итак, если это не путь, вам нужно указать каталог, что бы это ни было. – Marty Fried 14 March 2012 в 03:04

Когда вы запускаете команды в Linux, он ищет все каталоги, перечисленные в переменной среды PATH, и если он не находит команду там, вы получаете сообщение, которое вы видели.

Обычно это выглядит так:

PATH=/usr/local/bin:/usr/bin:/bin

Это означает, что он будет выглядеть первым в /usr/local/bin. Если он не найдет его там, он будет выглядеть в /usr/bin и т. Д.

На самом деле, это очень похоже на DOS / Windows: есть переменная с именем %PATH%, которая точно выполняет То же самое.

Разница в том, что в Windows также выполняется поиск текущего каталога. Unix считает, что это плохо, потому что локальный файл (например, вредоносное ПО) может случайно переопределить важные системные программы.

Если вы предпочитаете это, вы можете заставить Linux работать одинаково, добавив . в путь:

PATH=.:$PATH

(Это говорит, что set PATH - .: плюс существующее содержимое $PATH.)

В итоге он выглядит примерно так (это может быть другое на вашем компьютере):

PATH=.:/usr/local/bin:/usr/bin:/bin

Если вы не хотите этого делать, вы можете просто запустить каждую программу, указав каталог явно:

./myprog

или [!d10 ]

/home/username/myprog
8
ответ дан 25 May 2018 в 13:41
  • 1
    многому научился от этого ответа. спасибо @ams – H_7 6 May 2012 в 06:10
  • 2
    Если вы добавите . в PATH, всегда добавьте его последним. – muru 20 October 2016 в 10:11

По существу, a.out создается по умолчанию, потому что вы не указали имя для исполняемого файла. Попробуйте это вместо:

gcc HelloWorld.c -o HelloWorld

Как только вы это сделаете, вы сможете вызвать его (как предположил Сунил), предваряя «HelloWorld» точкой слэш (./):

./HelloWorld

Вот ссылка на статью, которая немного объясняет, почему создается a.out: Написание и компиляция C-программ в Linux.

3
ответ дан 25 May 2018 в 13:41

Когда вы запускаете команды в Linux, он ищет все каталоги, перечисленные в переменной среды PATH, и если он не находит команду там, вы получаете сообщение, которое вы видели.

Обычно это выглядит так:

PATH=/usr/local/bin:/usr/bin:/bin

Это означает, что он будет выглядеть первым в /usr/local/bin. Если он не найдет его там, он будет выглядеть в /usr/bin и т. Д.

На самом деле, это очень похоже на DOS / Windows: есть переменная с именем %PATH%, которая точно выполняет то же самое.

Разница заключается в том, что в Windows также выполняется поиск текущего каталога. Unix считает это плохой, потому что локальный файл (например, вредоносное ПО) может случайно переопределить важные системные программы.

Если вы предпочитаете это, вы можете заставить Linux работать одинаково, добавив . в путь:

PATH=.:$PATH

(Это говорит, что set PATH - .: плюс существующее содержимое $PATH.)

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

PATH=.:/usr/local/bin:/usr/bin:/bin

Если вы не хотите этого делать, вы можете просто запустить каждую программу, указав каталог явно:

./myprog

или

/home/username/myprog
8
ответ дан 2 August 2018 в 01:44

Другие вопросы по тегам:

Похожие вопросы: