В чем разница между «test» и «test.sh» при запуске сценариев оболочки?

Я столкнулся с аналогичной проблемой при обновлении с 15.10 по 16.04. Мышь будет работать в течение 5 секунд, а затем перейдет в спящий режим и не будет работать снова, если я не нажму кнопку. Моим решением было удалить энергосберегающий пакет, предназначенный для ноутбуков, а затем перезагрузиться:

sudo apt remove laptop-mode-tools
sudo reboot
1
задан 28 October 2017 в 17:52

3 ответа

Как оболочка выполняет команды:

Из руководства bash:

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

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

Почему моя команда «test» не сработала?

То, с чем вы столкнулись, - это команда test, которая является встроенной командой, совместимой с оригинальной оболочкой Bourne в bash. Эта команда неактивна и используется для простой логики, арифметической оценки и оценки строк. Он используется в логических выражениях и если утверждения:

bash-4.3$ test 1 -le 2 && echo "1 is less that or equal to 2"
1 is less that or equal to 2
bash-4.3$ if test 1 -le 2 ; then echo "1 is less than or equal to 2"; fi
1 is less than or equal to 2

Обратите внимание, что test и [ точно такие же:

bash-4.3$ [ 1 -le 2 ] && echo "1 is less that or equal to 2"
1 is less that or equal to 2
bash-4.3$ if [ 1 -le 2 ] ; then echo "1 is less than or equal to 2"; fi
1 is less than or equal to 2

Существует также /usr/bin/test стандартные утилиты и существуют для мобильности и совместимости. Если в вашей оболочке не было test, он просмотрел переменную PATH, и если /usr/bin/ оказался до вашего ~/bin в списке - он запустил бы /usr/bin/test. Вот пример этого:

bash-4.3$ enable -n test
bash-4.3$ PATH="$HOME/bin/:$PATH" test
I am ~/bin/test

Используя команду enable -n, мы отключим встроенный test и временно запустим test с измененным PATH, таким образом, мой ~/bin первый в списке. Оболочка просматривает список и находит мой сценарий оболочки ~/bin/test и запускает его.

ПРИМЕЧАНИЕ: пожалуйста, не делайте этого! Вышеприведенный пример предназначен только для демонстрации! Это не лучший способ запускать ваши скрипты и не рекомендуется. Используйте соответствующее имя, никогда не называйте свои команды такими же, как встроенные оболочки или существующие утилиты. Вы были предупреждены.

Почему работа test.sh?

Что случилось в вашем случае test.sh, так это то, что нет встроенного или функций, называемых test.sh, и поэтому оболочка просмотрел каждый каталог в списке PATH, пока он не нашел ваш файл test.sh и не запустил его. Вот почему это работает.

Связано ли это с расширениями файлов?

No. Это не имеет никакого отношения к расширениям файлов, и на самом деле для большинства файлов расширение не имеет значения. Shell заботится о расположении того, что вы вводите в командной строке, если это встроенная функция или функция или псевдоним, и если указанный вами файл имеет установленные разрешения.

Кроме того, он заботится о соответствующей строке #! (которая более формально известна как встроенная команда , совместимая с оригинальной оболочкой Bourne ), потому что, если у вас написан сценарий скрипта для C-оболочки, но у него нет соответствующей строки #! вверху, и вы пытаетесь запустить ее с помощью bash - оболочка попытается запустить ее, но она сломается из-за несовместимого синтаксиса.

В общем, Linux и Unix-подобные системы в основном заботятся о магических числах, которые вначале несколько байтов в файле, который идентифицирует тип файла.

3
ответ дан 22 May 2018 в 17:02

Как оболочка выполняет команды:

Из руководства bash:

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

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

Почему моя команда «test» не сработала?

То, с чем вы столкнулись, - это команда test, которая является встроенной командой, совместимой с оригинальной оболочкой Bourne в bash. Эта команда неактивна и используется для простой логики, арифметической оценки и оценки строк. Он используется в логических выражениях и если утверждения:

bash-4.3$ test 1 -le 2 && echo "1 is less that or equal to 2" 1 is less that or equal to 2 bash-4.3$ if test 1 -le 2 ; then echo "1 is less than or equal to 2"; fi 1 is less than or equal to 2

Обратите внимание, что test и [ точно такие же:

bash-4.3$ [ 1 -le 2 ] && echo "1 is less that or equal to 2" 1 is less that or equal to 2 bash-4.3$ if [ 1 -le 2 ] ; then echo "1 is less than or equal to 2"; fi 1 is less than or equal to 2

Существует также /usr/bin/test стандартные утилиты и существуют для мобильности и совместимости. Если в вашей оболочке не было test, он просмотрел переменную PATH, и если /usr/bin/ оказался до вашего ~/bin в списке - он запустил бы /usr/bin/test. Вот пример этого:

bash-4.3$ enable -n test bash-4.3$ PATH="$HOME/bin/:$PATH" test I am ~/bin/test

Используя команду enable -n, мы отключим встроенный test и временно запустим test с измененным PATH, таким образом, мой ~/bin первый в списке. Оболочка просматривает список и находит мой сценарий оболочки ~/bin/test и запускает его.

ПРИМЕЧАНИЕ: пожалуйста, не делайте этого! Вышеприведенный пример предназначен только для демонстрации! Это не лучший способ запускать ваши скрипты и не рекомендуется. Используйте соответствующее имя, никогда не называйте свои команды такими же, как встроенные оболочки или существующие утилиты. Вы были предупреждены.

Почему работа test.sh?

Что случилось в вашем случае test.sh, так это то, что нет встроенного или функций, называемых test.sh, и поэтому оболочка просмотрел каждый каталог в списке PATH, пока он не нашел ваш файл test.sh и не запустил его. Вот почему это работает.

Связано ли это с расширениями файлов?

No. Это не имеет никакого отношения к расширениям файлов, и на самом деле для большинства файлов расширение не имеет значения. Shell заботится о расположении того, что вы вводите в командной строке, если это встроенная функция или функция или псевдоним, и если указанный вами файл имеет установленные разрешения.

Кроме того, он заботится о соответствующей строке #! (которая более формально известна как встроенная команда , совместимая с оригинальной оболочкой Bourne ), потому что, если у вас написан сценарий скрипта для C-оболочки, но у него нет соответствующей строки #! вверху, и вы пытаетесь запустить ее с помощью bash - оболочка попытается запустить ее, но она сломается из-за несовместимого синтаксиса.

В общем, Linux и Unix-подобные системы в основном заботятся о магических числах, которые вначале несколько байтов в файле, который идентифицирует тип файла.

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

Как оболочка выполняет команды:

Из руководства bash:

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

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

Почему моя команда «test» не сработала?

То, с чем вы столкнулись, - это команда test, которая является встроенной командой, совместимой с оригинальной оболочкой Bourne в bash. Эта команда неактивна и используется для простой логики, арифметической оценки и оценки строк. Он используется в логических выражениях и если утверждения:

bash-4.3$ test 1 -le 2 && echo "1 is less that or equal to 2" 1 is less that or equal to 2 bash-4.3$ if test 1 -le 2 ; then echo "1 is less than or equal to 2"; fi 1 is less than or equal to 2

Обратите внимание, что test и [ точно такие же:

bash-4.3$ [ 1 -le 2 ] && echo "1 is less that or equal to 2" 1 is less that or equal to 2 bash-4.3$ if [ 1 -le 2 ] ; then echo "1 is less than or equal to 2"; fi 1 is less than or equal to 2

Существует также /usr/bin/test стандартные утилиты и существуют для мобильности и совместимости. Если в вашей оболочке не было test, он просмотрел переменную PATH, и если /usr/bin/ оказался до вашего ~/bin в списке - он запустил бы /usr/bin/test. Вот пример этого:

bash-4.3$ enable -n test bash-4.3$ PATH="$HOME/bin/:$PATH" test I am ~/bin/test

Используя команду enable -n, мы отключим встроенный test и временно запустим test с измененным PATH, таким образом, мой ~/bin первый в списке. Оболочка просматривает список и находит мой сценарий оболочки ~/bin/test и запускает его.

ПРИМЕЧАНИЕ: пожалуйста, не делайте этого! Вышеприведенный пример предназначен только для демонстрации! Это не лучший способ запускать ваши скрипты и не рекомендуется. Используйте соответствующее имя, никогда не называйте свои команды такими же, как встроенные оболочки или существующие утилиты. Вы были предупреждены.

Почему работа test.sh?

Что случилось в вашем случае test.sh, так это то, что нет встроенного или функций, называемых test.sh, и поэтому оболочка просмотрел каждый каталог в списке PATH, пока он не нашел ваш файл test.sh и не запустил его. Вот почему это работает.

Связано ли это с расширениями файлов?

No. Это не имеет никакого отношения к расширениям файлов, и на самом деле для большинства файлов расширение не имеет значения. Shell заботится о расположении того, что вы вводите в командной строке, если это встроенная функция или функция или псевдоним, и если указанный вами файл имеет установленные разрешения.

Кроме того, он заботится о соответствующей строке #! (которая более формально известна как встроенная команда , совместимая с оригинальной оболочкой Bourne ), потому что, если у вас написан сценарий скрипта для C-оболочки, но у него нет соответствующей строки #! вверху, и вы пытаетесь запустить ее с помощью bash - оболочка попытается запустить ее, но она сломается из-за несовместимого синтаксиса.

В общем, Linux и Unix-подобные системы в основном заботятся о магических числах, которые вначале несколько байтов в файле, который идентифицирует тип файла.

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

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

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