"/ bin / sh 'ls -l -R'" vs "/ bin / sh -c 'ls -l -R'" - PullRequest
2 голосов
/ 23 марта 2010

В чем разница между следующими двумя командами при запуске в AIX?

/bin/sh 'ls -l -R'
/bin/sh -c 'ls -l -R'

Ответы [ 2 ]

10 голосов
/ 23 марта 2010

В AIX /bin/sh по умолчанию использует оболочку Korn (ksh).

/bin/sh 'ls -l -R'

При использовании ksh оболочка запускается, сообщая ей о запуске сценария с именем ls -l -R (в текущем каталогеили на пути).Если сценарий с таким именем не найден, ksh рассматривает аргумент как команду и запускает его.

Обратите внимание, что при использовании bash, если скрипт не может быть найден, это приведет к ошибке.

/bin/sh -c 'ls -l -R'

Запускает новый экземпляр оболочки, сообщая ему выполнить команду ls -l -R.

5 голосов
/ 23 марта 2010

(Это ответ Фила Росса, но мне нужно форматирование:)

Используя одну из моих учетных записей Linux:

sh> /bin/sh --version
GNU bash, version 3.2.39(1)-release (i386-redhat-linux-gnu)
Copyright (C) 2007 Free Software Foundation, Inc.
sh>  /bin/sh 'ls -l -R'
/bin/sh: ls -l -R: No such file or directory
sh> /bin/sh ls
/bin/ls: /bin/ls: cannot execute binary file
sh> /bin/sh -c 'ls -l | head -1'
total 147296
sh> 

Использование одной из моих установок Cygwin:

sh> /bin/sh --version
GNU bash, version 3.2.49(23)-release (i686-pc-cygwin)
Copyright (C) 2007 Free Software Foundation, Inc.
sh> /bin/sh 'ls -l -R'
/bin/sh: ls -l -R: No such file or directory
sh> /bin/sh ls
/usr/bin/ls: /usr/bin/ls: cannot execute binary file
sh> /bin/sh -c 'ls -l | head -1'
total 264744
sh> 

Ваш /bin/sh может отличаться, но это подходящее поведение:

  • предоставление аргумента имени файла в / bin / sh интерпретирует его как имя файла сценария оболочки и попытается выполнить его
  • предоставление аргумента -c будет интерпретировать этот аргумент как командную строку / bin / sh и попытаться выполнить его

Для получения более подробной информации введите

man sh
...