Является ли ./ (точечная косая черта) командой?

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

, чтобы он не попал к многословным, я просто хотел сказать в xterm в качестве подставки-в для xterm / GNOME в консоль / mrxvt / и т. д. / и т. д. Же для bash.

консоль

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

терминал: что-то, что обеспечивает взаимодействие человека с программами через двунаправленный поток символов ASCII / UTF8 в / других персонажей, обычно с vt100 или аналогичная обработка Escape-код. (Напр. клавишу backspace, удалить, стрелки и т. д. генерировать коды побег. Программы могут печатать побег коды для перемещения курсора по экрану терминала, переключение на жирный шрифт и/или цвет, четкие или прокрутка экрана и т. д.) В старые времена, часто это специализированное устройство с экраном и клавиатурой и последовательным портом. Теперь, это, как правило, программа таких как xterm.

есть файлы устройства, программы для чтения/записи из/в терминалы и виртуальные терминалы также имеют другую сторону работает как файл устройства. Это когда в xterm пишет вашего входа, так что баш может прочитать его.

каждый терминал, в том числе и виртуальные, обеспечивает основную линию редактирования, когда это в вареном (в отличии от сырой). Это обрабатывается код ядра. Это баш, который обеспечивает линию редактирования, что вы можете сделать с помощью клавиш со стрелками. (Попробуйте запустить [Ф1] и введите, если вы хотите, чтобы увидеть, что основное ядро-линии редактирования, как. Забой работает, и несколько других вещей, как в настройках действовать до его закрытия.)

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

изменить: Жиль убедил меня, что ссылаясь на терминал как терминал правильного использования. Эмуляторы терминала, и интерактивные программы, которые запускаются подключен к терминалу, все зависит от семантики терминала реализуется на уровне ядра. (Большая часть этого поведения стандартизирована в posix, и то же самое через Линукс/*БСД/другие Unix.) Полноэкранный редактор текста зависит от поведения ОС Unix телетайп материалов, а также курсор-движение бежать-код обработки, и многих других функций, эмулятор терминала.

однако физические ВТ100 с экрана, клавиатуры и последовательного порта является экземпляром терминал. Она не требует ядра Unix на другой конец своего последовательного порта для полноты. Что-то совершенно другое, может быть отправить его Escape-коды и в текстовом, и получать то же от него. Это будет просто ВТ100, хотя, не терминала Unix. Эмулятор терминала плюс семантика Unix телетайп составляют полный пакет терминала Unix, что программа, Как баш нормально работает.

терминал - стиль пользовательского интерфейса, где вы что-то тип, затем нажмите клавишу Return, чтобы сделать что-то случится. Он также используется в качестве сокращения для командной строки оболочки, такие как bash или MS-DOS, но вы также можете сказать: “это инструмент командной строки” о чем-то вроде программы fdisk. Рассматривая только те программы, которые используют терминал для их пользовательского интерфейса, два основных семей командной строки и на весь экран текст (например, редактором, например VI или [F2]).

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

командный интерпретатор-это программа для запуска других программ. В контексте Unix, это часто означает, оболочка командной строки (т. е. Bourne оболочки или с оболочкой эквивалент). Оболочки Unix также можете прочитать их ввод из файлов, т. е. скрипты. Они полны языков программирования, переменные, циклы и условные операторы, и многие программы написаны на bash (или только [Ф3] оболочка posix функции для удобства перемещения). Это также легко можно написать быстрый [Ф4] в интерактивную оболочку.

если сложить все вместе, оболочки, такие как bash (или любой другой программы, которую вы начали, запустив командную строку) будет получать символы из [ф5] терминального устройства после того, как в xterm пишет свой вклад в его сторону псевдо-терминал. Если вы запустите [ф6], затем нажмите [ф7], код ядра телетайп будет действовать на [F8] и отправить на [F9], чтобы процесс переднего плана на этот терминал. (Обратите внимание на использование консоли в данном контексте означает Unix и телетайп, а не эмулятор терминала или что-то подключил к последовательному порту.) Это происходит потому, что оболочка ставит терминал в "вареных" режим перед началом любой программы, что означает, что акты ядра на некоторых контрольно-последовательностей. (Код tty по-прежнему не имеет ничего общего с обработкой ВТ100 Escape-кодов, несколько низкий-коды ASCII управления). Если вместо окна xterm, вы используете текстовый терминал консоли Linux, то ядро делает ВТ100 эмуляции, и регулировать все это. Linux может быть скомпилирован без виртуальной консоли текст поддержки терминала, но не без поддержки телетайпа.

оболочки иногда используется как синоним для терминала (KDE еще есть эмулятор терминал называется терминал).

как 0xSheepdog очков, он также имеет и другое значение: локально оборудования взаимодействие человека.

в контексте ядра, консоль имеет еще одно специфическое значение: это терминал, где написано загрузки сообщения. Это может быть последовательный порт. Обычно, конечно, это текстовой консоли реализуется на уровне ядра поверх драйверы для графических устройств и USB/PS2 и на клавишных. Если вы загрузить Linux с [ф10] в командной строке, вы получите сообщения ядра на экране и на последовательный порт.

Linux реализует виртуальных консолей ([F11], чтобы Н). Вы можете поменять что одно ваше физическое экрана/клавиатуры управление с помощью клавиш Ctrl+Альт+ФН. Типичные дистрибутивы Linux создать 6, и начать [ф12] на все из них, так что даже если Вы не можете или не хотите запустить Х11, вы можете войти в 6 раз и переключаться между командой, Man-страницы, и все остальное, без запуска программы, как экрана. Linux (ядро) включает в себя ВТ100-стиль эмулятор терминала, чтобы обеспечить интерфейс терминала через экран и клавиатуру на виртуальных консолей.

стандартный 6 виртуальных терминалов с логином запрашивает почему сочетание клавиш Ctrl+АЛТ+значок получает вас обратно к вашей сессии Х11: x-сервер берет следующую доступную виртуальную консоль. (X-сервер открывает [от f13] напрямую, а не получать ваши нажатия клавиш от [ф14], хотя.)

так что "поменять в текстовой консоли" означает нажатие значок+АЛТ+ФН и использовать этот терминал. Когда компьютеры были медленными и не так много оперативной памяти, некоторые люди проводили большую часть своего времени на текстовых консолях, так как они были быстры, можно установить красивый шрифт, и даже изменить размер терминала, чтобы иметь меньше персонажей, но более на экране одновременно. Alt+влево и Alt+вправо поменять в консоли prev или Next. (Х11 снимает для своей консоли, конечно, оставив только сочетание клавиш Ctrl+Альт+ФН комбо.)

так Н это только один из этих терминов, которые не имеют один четко определенный технический смысл. Он имеет пару разных. (В зависимости от того как вы относитесь собственно терминал и терминал плюс обработка телетайп, можно сказать, что терминал также имеет несколько значений.)

16
задан 28 October 2017 в 20:41

9 ответов

./ не является командой. Команда ./truecrypt-7.2-setup-x86.

Ваша оболочка и программы, такие как sudo, будут обрабатывать команду как путь, если она содержит хотя бы один символ /. Поскольку . представляет любую директорию, в которой вы сейчас находитесь, ./truecrypt-7.2-setup-x86 называет файл truecrypt-7.2-setup-x86 в текущем каталоге. Если этот файл отсутствует или файл не может быть запущен, тогда вы получите сообщение об ошибке.

Когда команда не содержит косой черты, каталоги, перечисленные в pathname [ ! d2], как говорит Сергей Колодяжный. Текущий каталог не будет автоматически искать - и не рекомендуется помещать . в $PATH. Таким образом, вы случайно не запускаете те вещи, которые вы не ожидали запускать, потому что у вас было cd d к каталогу, который их содержит.

Написание ./ перед именем исполняемого файла в текущем каталоге Сергей Колодяжный говорит , чтобы запустить его, но на самом деле это не специальный синтаксис. Например, если вы испортили свой $PATH, и вам нужно было запустить команду наподобие ls, вы могли бы написать /bin/ls. В этом случае или вообще нет необходимости .; / всегда является текущим каталогом, а / - это только разделитель каталогов, первое, что нужно /, где-то в пути, означающем, что вы имеете в виду, что это путь.

чтобы убедиться, что файл, который вы назвали, действительно существует в текущем каталоге. (Если это так, то проверьте его разрешения, как объясняет Чарльз Грин, но если вы извлекли файл из архива, то он не уже будет иметь исполняемые разрешения, если он предназначен для запуска.) [ ! d10]

24
ответ дан 22 May 2018 в 17:04

./ не является командой. Команда ./truecrypt-7.2-setup-x86.

Ваша оболочка и программы, такие как sudo, будут обрабатывать команду как путь, если она содержит хотя бы один символ /. Поскольку . представляет любую директорию, в которой вы сейчас находитесь, ./truecrypt-7.2-setup-x86 называет файл truecrypt-7.2-setup-x86 в текущем каталоге. Если этот файл отсутствует или файл не может быть запущен, тогда вы получите сообщение об ошибке.

Когда команда не содержит косой черты, каталоги, перечисленные в pathname [ ! d2], как говорит Сергей Колодяжный. Текущий каталог не будет автоматически искать - и не рекомендуется помещать . в $PATH. Таким образом, вы случайно не запускаете те вещи, которые вы не ожидали запускать, потому что у вас было cd d к каталогу, который их содержит.

Написание ./ перед именем исполняемого файла в текущем каталоге Сергей Колодяжный говорит , чтобы запустить его, но на самом деле это не специальный синтаксис. Например, если вы испортили свой $PATH, и вам нужно было запустить команду наподобие ls, вы могли бы написать /bin/ls. В этом случае или вообще нет необходимости .; / всегда является текущим каталогом, а / - это только разделитель каталогов, первое, что нужно /, где-то в пути, означающем, что вы имеете в виду, что это путь.

чтобы убедиться, что файл, который вы назвали, действительно существует в текущем каталоге. (Если это так, то проверьте его разрешения, как объясняет Чарльз Грин, но если вы извлекли файл из архива, то он не уже будет иметь исполняемые разрешения, если он предназначен для запуска.) [ ! d10]

24
ответ дан 18 July 2018 в 04:26

./ не является командой. Команда ./truecrypt-7.2-setup-x86.

Ваша оболочка и программы, такие как sudo, будут обрабатывать команду как путь, если она содержит хотя бы один символ /. Поскольку . представляет любую директорию, в которой вы сейчас находитесь, ./truecrypt-7.2-setup-x86 называет файл truecrypt-7.2-setup-x86 в текущем каталоге. Если этот файл отсутствует или файл не может быть запущен, тогда вы получите сообщение об ошибке.

Когда команда не содержит косой черты, каталоги, перечисленные в pathname [ ! d2], как говорит Сергей Колодяжный. Текущий каталог не будет автоматически искать - и не рекомендуется помещать . в $PATH. Таким образом, вы случайно не запускаете те вещи, которые вы не ожидали запускать, потому что у вас было cd d к каталогу, который их содержит.

Написание ./ перед именем исполняемого файла в текущем каталоге Сергей Колодяжный говорит , чтобы запустить его, но на самом деле это не специальный синтаксис. Например, если вы испортили свой $PATH, и вам нужно было запустить команду наподобие ls, вы могли бы написать /bin/ls. В этом случае или вообще нет необходимости .; / всегда является текущим каталогом, а / - это только разделитель каталогов, первое, что нужно /, где-то в пути, означающем, что вы имеете в виду, что это путь.

чтобы убедиться, что файл, который вы назвали, действительно существует в текущем каталоге. (Если это так, то проверьте его разрешения, как объясняет Чарльз Грин, но если вы извлекли файл из архива, то он не уже будет иметь исполняемые разрешения, если он предназначен для запуска.) [ ! d10]

24
ответ дан 24 July 2018 в 18:04

.. / часть команды говорит: «Посмотрите в текущем каталоге и выполните команду« truecrypt-7.2-setup-x86 »отсюда». Вам необходимо запустить эту команду из каталога, в котором вы распаковали файл.

Это можно протестировать: в том же окне терминала, где вы пытаетесь выполнить команду, введите команду ls -l true* - если файл присутствующий в текущем рабочем каталоге, будет отображаться листинг, показывающий файл (и пучок дополнительной информации).

Как заметила Zanna в комментариях, у вашего файла могут не быть разрешения на выполнение - это может легко фиксироваться. В качестве тестового примера в моем каталоге показано

chick@dad:~/test$ ls -l
total 4
-rw-r--r-- 1 chick chick 788 Oct 27 06:15 rFullBack
chick@dad:~/test$

, а файл «rFullBack» перечисляет «-rw-» в качестве моего разрешения для чтения и записи файла. Я могу выполнить команду chmod +x rFullBack, а список каталогов изменится на

chick@dad:~/test$ ls -l
total 4
-rwxr-xr-x 1 chick chick 788 Oct 27 06:15 rFullBack
chick@dad:~/test$

Там мои разрешения теперь «-rwx», указывая, что я могу выполнить файл.

Короче говоря, если файл существует в вашем каталоге

, запустите команду

chmod +x ./truecrypt-7.2-setup-x86

, а затем команду

sudo ./truecrypt-7.2-setup-x86
21
ответ дан 22 May 2018 в 17:04
  • 1
    Не совсем. Он отображает rw- как ваше разрешение - -, прежде чем он будет установлен для идентификатора [gu] id и липких бит. – Duncan X Simpson 28 October 2017 в 00:33
  • 2
    @DuncanXSimpson Спасибо - я немного обновил описание разрешений, но я собираюсь игнорировать setguid и липкие биты для этого ответа! – Charles Green 28 October 2017 в 01:57

Как работают команды вызова в работе оболочки

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

Что произойдет, если команда, которую вы хотите запустить, находится в том же каталоге, который вы сейчас находите, но этот каталог отсутствует в списке каталогов PATH? Вот тогда вам нужно использовать ./. Это точно так же, как и /bin/bash - вы сообщаете оболочке, где находится ваша желаемая команда, полный путь к ней. И в случае с ./ вы говорите, чтобы оболочка «смотри в этом каталоге». Итак, важно то, что вы должны находиться в том же каталоге, где находится файл.

Конечно, чтобы фактически запустить исполняемый файл, он должен иметь установленный бит бит, поэтому вам нужно будет chmod +x ./my_file.

Итак, важные шаги:

cd, где вы сохранили файл; если он находится в ~/Downloads, затем cd ~/Downloads Выполнить chmod +x ./truecrypt-7.2-setup-x86, это говорит: «Сделать файл truecrypt-7.2-setup-x86, который находится в этом исполняемом каталоге» И теперь сделайте sudo ./truecrypt-7.2-setup-x86

Обратите внимание, что использование ./ не является случайным поведением, но на самом деле является стандартом, определенным стандартом Portable Operating System Interface (aka POSIX), в частности, см. раздел «Поиск и выполнение команд».

Воспроизведение ошибки

$ # my script is in ~/Downloads folder
$ stat -c "%n" /home/xieerqi/Downloads/my_script.sh                         
/home/xieerqi/Downloads/my_script.sh
$ # if I run sudo ./my_script.sh, we get an error
$ sudo ./my_script.sh
[sudo] password for xieerqi: 
sudo: ./my_script.sh: command not found
$ # of course the command not found because file is not in ./, not in this dir
$ # this is not  sudo's problem
$ # but sudo does indeed show the same error even if you're in same directory
$ cd ./Downloads/                                                                                                                                                      
$ sudo ./my_script.sh                                                                                                                                                  
[sudo] password for xieerqi: 
sudo: ./my_script.sh: command not found

ПРИМЕЧАНИЕ: сообщение об ошибке, данное sudo, очевидно, вводит в заблуждение, поэтому это нужно иметь в виду; однако, пожалуйста, обратите внимание, что это не ядро ​​вопроса, который задает ОП.

Документация и ссылки

В руководстве bash 4.3 «РАЗРЕШЕНИЕ КОМАНДЫ»:

Если имя не является ни функцией оболочки, ни встроенным, а не содержит нити, bash ищет каждый элемент PATH для каталога, содержащего исполняемый файл с этим именем.

Из Стандарт портативного интерфейса операционной системы (aka POSIX) :

Если имя не является ни функцией оболочки, ни встроенным, и не содержит slashes, bash ищет каждый элемент PATH для каталога, содержащего исполняемый файл с этим именем.

8
ответ дан 22 May 2018 в 17:04
  • 1
    Фактически выход sudo вводит в заблуждение. Если вы попробуете то же самое без sudo, вы получите еще одну ошибку из bash: Permission denied. И это правильно, так как вы не дали разрешение на выполнение скрипта (через chmod +x). – Ruslan 27 October 2017 в 21:20
  • 2
    @Ruslan тот факт, что вывод sudo вводит в заблуждение, правда, но это ошибка, которая появляется. Это может быть что-то сообщить разработчикам и позволить им исправить это. Однако это не является основной темой обсуждения - нам нужно было установить, что сделал OP для создания такой ошибки, и направлять их на правильный путь. Независимо от того, вводит ли оно в заблуждение - это не проблема. – Sergiy Kolodyazhnyy 27 October 2017 в 21:28
  • 3
    По-другому, это точно так же, как с помощью /bin/bash: он не позволяет выполнять скрипт, на котором у вас нет разрешения на выполнение. Когда вы предикате имя сценария с помощью /bin/bash, все, что имеет значение /bin/bash, имеет значение, поскольку это команда - это выполняемая команда. Когда вы этого не сделаете, сам сценарий выполняется, что, в свою очередь, ведет к вашей текущей оболочке или тому, что находится в верхней строке #!, вызываемой – Monty Harder 27 October 2017 в 23:05
  • 4
    @MontyHarder /bin/bash - просто пример. Тот факт, что мы вызываем /bin/bash и ./script.sh, указывая путь к выполняемой вещи - это то же самое. Сценарий предварительного кодирования с bash script.sh или /bin/bash script.sh является полностью другой темой, где вы запускаете исполняемый файл и передаете ему сценарий в качестве аргумента, который, к слову, может прерываться, если синтаксис написан для чего-то другого, кроме которую вы вызываете, скажите csh. /bin/bash является исполняемым, но факт в том, что вы все еще указываете полный путь к нему. – Sergiy Kolodyazhnyy 27 October 2017 в 23:16
  • 5
    @SergiyKolodyazhnyy Предназначение имени скрипта с /bin/bash или даже просто bash является также обычным способом решения проблемы отсутствия исполняемых разрешений для скрипта. Указание полного пути к скрипту делает не решение этой проблемы. Поэтому /bin/bash является особенно плохим примером в этом конкретном случае. – Monty Harder 28 October 2017 в 00:36

Как работают команды вызова в работе оболочки

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

Что произойдет, если команда, которую вы хотите запустить, находится в том же каталоге, который вы сейчас находите, но этот каталог отсутствует в списке каталогов PATH? Вот тогда вам нужно использовать ./. Это точно так же, как и /bin/bash - вы сообщаете оболочке, где находится ваша желаемая команда, полный путь к ней. И в случае с ./ вы говорите, чтобы оболочка «смотри в этом каталоге». Итак, важно то, что вы должны находиться в том же каталоге, где находится файл.

Конечно, чтобы фактически запустить исполняемый файл, он должен иметь установленный бит бит, поэтому вам нужно будет chmod +x ./my_file.

Итак, важные шаги:

cd, где вы сохранили файл; если он находится в ~/Downloads, затем cd ~/Downloads Выполнить chmod +x ./truecrypt-7.2-setup-x86, это говорит: «Сделать файл truecrypt-7.2-setup-x86, который находится в этом исполняемом каталоге» И теперь сделайте sudo ./truecrypt-7.2-setup-x86

Обратите внимание, что использование ./ не является случайным поведением, но на самом деле является стандартом, определенным стандартом Portable Operating System Interface (aka POSIX), в частности, см. раздел «Поиск и выполнение команд».

Воспроизведение ошибки

$ # my script is in ~/Downloads folder $ stat -c "%n" /home/xieerqi/Downloads/my_script.sh /home/xieerqi/Downloads/my_script.sh $ # if I run sudo ./my_script.sh, we get an error $ sudo ./my_script.sh [sudo] password for xieerqi: sudo: ./my_script.sh: command not found $ # of course the command not found because file is not in ./, not in this dir $ # this is not sudo's problem $ # but sudo does indeed show the same error even if you're in same directory $ cd ./Downloads/ $ sudo ./my_script.sh [sudo] password for xieerqi: sudo: ./my_script.sh: command not found

ПРИМЕЧАНИЕ: сообщение об ошибке, данное sudo, очевидно, вводит в заблуждение, поэтому это нужно иметь в виду; однако, пожалуйста, обратите внимание, что это не ядро ​​вопроса, который задает ОП.

Документация и ссылки

В руководстве bash 4.3 «РАЗРЕШЕНИЕ КОМАНДЫ»:

Если имя не является ни функцией оболочки, ни встроенным, а не содержит нити, bash ищет каждый элемент PATH для каталога, содержащего исполняемый файл с этим именем.

Из Стандарт портативного интерфейса операционной системы (aka POSIX) :

Если имя не является ни функцией оболочки, ни встроенным, и не содержит slashes, bash ищет каждый элемент PATH для каталога, содержащего исполняемый файл с этим именем.

8
ответ дан 18 July 2018 в 04:26

.. / часть команды говорит: «Посмотрите в текущем каталоге и выполните команду« truecrypt-7.2-setup-x86 »отсюда». Вам необходимо запустить эту команду из каталога, в котором вы распаковали файл.

Это можно протестировать: в том же окне терминала, где вы пытаетесь выполнить команду, введите команду ls -l true* - если файл присутствующий в текущем рабочем каталоге, будет отображаться листинг, показывающий файл (и пучок дополнительной информации).

Как заметила Zanna в комментариях, у вашего файла могут не быть разрешения на выполнение - это может легко фиксироваться. В качестве тестового примера в моем каталоге показано

chick@dad:~/test$ ls -l total 4 -rw-r--r-- 1 chick chick 788 Oct 27 06:15 rFullBack chick@dad:~/test$

, а файл «rFullBack» перечисляет «-rw-» в качестве моего разрешения для чтения и записи файла. Я могу выполнить команду chmod +x rFullBack, а список каталогов изменится на

chick@dad:~/test$ ls -l total 4 -rwxr-xr-x 1 chick chick 788 Oct 27 06:15 rFullBack chick@dad:~/test$

Там мои разрешения теперь «-rwx», указывая, что я могу выполнить файл.

Короче говоря, если файл существует в вашем каталоге

, запустите команду

chmod +x ./truecrypt-7.2-setup-x86

, а затем команду

sudo ./truecrypt-7.2-setup-x86
21
ответ дан 18 July 2018 в 04:26

Как работают команды вызова в работе оболочки

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

Что произойдет, если команда, которую вы хотите запустить, находится в том же каталоге, который вы сейчас находите, но этот каталог отсутствует в списке каталогов PATH? Вот тогда вам нужно использовать ./. Это точно так же, как и /bin/bash - вы сообщаете оболочке, где находится ваша желаемая команда, полный путь к ней. И в случае с ./ вы говорите, чтобы оболочка «смотри в этом каталоге». Итак, важно то, что вы должны находиться в том же каталоге, где находится файл.

Конечно, чтобы фактически запустить исполняемый файл, он должен иметь установленный бит бит, поэтому вам нужно будет chmod +x ./my_file.

Итак, важные шаги:

cd, где вы сохранили файл; если он находится в ~/Downloads, затем cd ~/Downloads Выполнить chmod +x ./truecrypt-7.2-setup-x86, это говорит: «Сделать файл truecrypt-7.2-setup-x86, который находится в этом исполняемом каталоге» И теперь сделайте sudo ./truecrypt-7.2-setup-x86

Обратите внимание, что использование ./ не является случайным поведением, но на самом деле является стандартом, определенным стандартом Portable Operating System Interface (aka POSIX), в частности, см. раздел «Поиск и выполнение команд».

Воспроизведение ошибки

$ # my script is in ~/Downloads folder $ stat -c "%n" /home/xieerqi/Downloads/my_script.sh /home/xieerqi/Downloads/my_script.sh $ # if I run sudo ./my_script.sh, we get an error $ sudo ./my_script.sh [sudo] password for xieerqi: sudo: ./my_script.sh: command not found $ # of course the command not found because file is not in ./, not in this dir $ # this is not sudo's problem $ # but sudo does indeed show the same error even if you're in same directory $ cd ./Downloads/ $ sudo ./my_script.sh [sudo] password for xieerqi: sudo: ./my_script.sh: command not found

ПРИМЕЧАНИЕ: сообщение об ошибке, данное sudo, очевидно, вводит в заблуждение, поэтому это нужно иметь в виду; однако, пожалуйста, обратите внимание, что это не ядро ​​вопроса, который задает ОП.

Документация и ссылки

В руководстве bash 4.3 «РАЗРЕШЕНИЕ КОМАНДЫ»:

Если имя не является ни функцией оболочки, ни встроенным, а не содержит нити, bash ищет каждый элемент PATH для каталога, содержащего исполняемый файл с этим именем.

Из Стандарт портативного интерфейса операционной системы (aka POSIX) :

Если имя не является ни функцией оболочки, ни встроенным, и не содержит slashes, bash ищет каждый элемент PATH для каталога, содержащего исполняемый файл с этим именем.

8
ответ дан 24 July 2018 в 18:04
  • 1
    Фактически выход sudo вводит в заблуждение. Если вы попробуете то же самое без sudo, вы получите еще одну ошибку из bash: Permission denied. И это правильно, так как вы не дали разрешение на выполнение скрипта (через chmod +x). – Ruslan 27 October 2017 в 21:20
  • 2
    @Руслан тот факт, что выход sudo это заблуждение верно, но это ошибка, которая показывает вверх. Что может быть что-то сообщить разработчикам и пусть они это исправить. Однако это не суть дискуссии - нам нужно установить, что ОП сделал для того чтобы произвести такие ошибки, и направлять их на правильный путь. Будь или не это вводит в заблуждение - это не проблема здесь. – Sergiy Kolodyazhnyy 27 October 2017 в 21:28
  • 3
    По-другому, это точно так же, как с помощью /bin/bash: он не позволяет выполнять скрипт, на котором у вас нет разрешения на выполнение. Когда вы предикате имя сценария с помощью /bin/bash, все, что имеет значение /bin/bash, имеет значение, поскольку это команда - это выполняемая команда. Когда вы этого не сделаете, сам сценарий выполняется, что, в свою очередь, ведет к вашей текущей оболочке или тому, что находится в верхней строке #!, вызываемой – Monty Harder 27 October 2017 в 23:05
  • 4
    @MontyHarder /bin/bash - просто пример. Тот факт, что мы вызываем /bin/bash и ./script.sh, указывая путь к выполняемой вещи - это то же самое. Сценарий предварительного кодирования с bash script.sh или /bin/bash script.sh является полностью другой темой, где вы запускаете исполняемый файл и передаете ему сценарий в качестве аргумента, который, к слову, может прерываться, если синтаксис написан для чего-то другого, кроме которую вы вызываете, скажите csh. /bin/bash является исполняемым, но факт в том, что вы все еще указываете полный путь к нему. – Sergiy Kolodyazhnyy 27 October 2017 в 23:16
  • 5
    @SergiyKolodyazhnyy Предназначение имени скрипта с /bin/bash или даже просто bash является также обычным способом решения проблемы отсутствия исполняемых разрешений для скрипта. Указание полного пути к скрипту делает не решение этой проблемы. Поэтому /bin/bash является особенно плохим примером в этом конкретном случае. – Monty Harder 28 October 2017 в 00:36

.. / часть команды говорит: «Посмотрите в текущем каталоге и выполните команду« truecrypt-7.2-setup-x86 »отсюда». Вам необходимо запустить эту команду из каталога, в котором вы распаковали файл.

Это можно протестировать: в том же окне терминала, где вы пытаетесь выполнить команду, введите команду ls -l true* - если файл присутствующий в текущем рабочем каталоге, будет отображаться листинг, показывающий файл (и пучок дополнительной информации).

Как заметила Zanna в комментариях, у вашего файла могут не быть разрешения на выполнение - это может легко фиксироваться. В качестве тестового примера в моем каталоге показано

chick@dad:~/test$ ls -l total 4 -rw-r--r-- 1 chick chick 788 Oct 27 06:15 rFullBack chick@dad:~/test$

, а файл «rFullBack» перечисляет «-rw-» в качестве моего разрешения для чтения и записи файла. Я могу выполнить команду chmod +x rFullBack, а список каталогов изменится на

chick@dad:~/test$ ls -l total 4 -rwxr-xr-x 1 chick chick 788 Oct 27 06:15 rFullBack chick@dad:~/test$

Там мои разрешения теперь «-rwx», указывая, что я могу выполнить файл.

Короче говоря, если файл существует в вашем каталоге

, запустите команду

chmod +x ./truecrypt-7.2-setup-x86

, а затем команду

sudo ./truecrypt-7.2-setup-x86
21
ответ дан 24 July 2018 в 18:04
  • 1
    Не совсем. Он отображает rw- как ваше разрешение - -, прежде чем он будет установлен для идентификатора [gu] id и липких бит. – Duncan X Simpson 28 October 2017 в 00:33
  • 2
    @DuncanXSimpson Спасибо - я обновил немного описание разрешения, но я собираюсь игнорировать setguid и липкие биты за этот ответ! – Charles Green 28 October 2017 в 01:57

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

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