Разница между + x и ./<script> и sh ./<script>

Согласно ifconfig man:

Эта программа устарела! Для замены проверьте ip addr и ip link. Для статистики используйте ссылку ip -s.

Таким образом, используя команду ip:

 $ ip -s link

Мы можем получить сетевую статистику:

1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN mode DEFAULT group default qlen 1
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    RX: bytes  packets  errors  dropped overrun mcast
    173654497900 26078946 0       0       0       0
    TX: bytes  packets  errors  dropped carrier collsns
    173654497900 26078946 0       0       0       0
2: ens3: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP mode DEFAULT group default qlen 1000
    link/ether 12:34:56:78:90:00 brd ff:ff:ff:ff:ff:ff
    RX: bytes  packets  errors  dropped overrun mcast
    3650412438854 399476618 0       2551849 0       0
    TX: bytes  packets  errors  dropped carrier collsns
    617437624480 321390259 0       0       0       0

Или

$ ip -s -h link

1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN mode DEFAULT group default qlen 1
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 promiscuity 0 addrgenmode eui64
    RX: bytes  packets  errors  dropped overrun mcast
    174G       26.1M    0       0       0       0
    TX: bytes  packets  errors  dropped carrier collsns
    174G       26.1M    0       0       0       0 2: ens3: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP mode DEFAULT group default qlen 1000
    link/ether 12:34:56:78:90:00 brd ff:ff:ff:ff:ff:ff promiscuity 0 addrgenmode eui64
    RX: bytes  packets  errors  dropped overrun mcast
    3.65T      399M     0       2.55M   0       0
    TX: bytes  packets  errors  dropped carrier collsns
    617G       321M     0       0       0       0
1
задан 25 June 2014 в 01:09

4 ответа

Пока это сценарий оболочки sh (Dash или эквивалентный), нет, нет никакой внешней разницы.

Проблема в .run не гарантирует, что это так. Он может быть двоичным. Это может быть Bash или Python или PHP или что-то еще; все они имеют хэширование скрипта. Если вы слепо пропустите его через sh, кто знает, что может случиться. Вероятно, это ошибка, но он может случайно запустить вредоносный код до того, как до него дойдет.

По chmod ding it (чтобы включить бит разрешения выполнения), а затем запустив его ./script.run, вы даете это лучшая возможная возможность работы. Если это скрипт оболочки, его хеш-бэнг будет правильно проанализирован, и если он будет бинарным исполняемым файлом, он будет запускаться изначально.

7
ответ дан 24 May 2018 в 06:22
  • 1
    Ах не знал, что спасибо за ответ, просто проверил исполняемый файл, я запускаю хэш-бэнг / bin / sh, поэтому я думаю, что это нормально – user36976 23 June 2014 в 14:41

Эти два метода часто действуют одинаково, но очень разные.

sh ./script запускает команду sh с аргументом ./script, который, случается, выполняет данный скрипт .. даже если сценарий на самом деле не скрипт sh (плохой)

./script выполняет данный файл. Он делает это, ища строку «shebang», чтобы определить, какую команду запускать. Если unspecified, он использует sh (это два метода действуют одинаково иногда), но часто задается другой интерпретатор.

Например, если filename содержит следующее:

[ f1]

.. тогда две команды очень разные:

$ sh script
script: line 3: print: command not found
$ chmod +x script
$ ./script
This is a Python script!

Если нет линии shebang, то они одинаковы:

$ cat script
echo "This is an sh script"
$ sh ./script
This is an sh script
$ ./script
This is an sh script
1
ответ дан 24 May 2018 в 06:22

Важным отличием является то, что ваша линия hashbang имеет параметры. Например, если скрипт начинается с

#!/bin/bash -e

... и вы запускаете его извне с помощью sh или bash, эта строка будет интерпретироваться как комментарий и игнорироваться, поэтому (выход при сбое) не будет обработан. Итак, учитывая следующий скрипт:

#!/bin/bash -e
echo Hello
false
echo goodbye

Вывод для ./script будет просто «Hello», но выход для sh script будет Hello, а затем goodbye, который был вероятно, не предназначено.

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

1
ответ дан 24 May 2018 в 06:22

Нет

[sudo] chmod +x ./<scrupt>.run делает исполняемый файл сценария, поэтому вы можете запустить его с помощью ./<script>.run. С помощью [sudo] sh ./<script>.run вы можете запустить его, даже если он не является исполняемым.

0
ответ дан 24 May 2018 в 06:22

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

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