Различие между “$SHELL эха” и, “которые колотят”

Вы могли бы попробовать это:

:.,'c normal @a

Это использует “расположенный” :normal управляйте для выполнения команды нормального режима @a с курсором, последовательно расположенным на первый столбец каждой строки, запускающейся с текущей строки и снижающейся к строке с меткой c. Если метка, окажется, будет выше курсора, то Vim спросит, хотите ли Вы инвертировать диапазон.

Это - не всегда то же как применение количества к @a (например. 5@a) потому что содержание регистра, можение не всегда спускает одну строку каждый раз, когда это выполняется (рассматривают “макрос”, который использует поиски для перемещений вместо j или k: это потребовало бы более высокого количества к полностью производственным линейкам, которые имеют несколько соответствий).

5
19.07.2012, 18:00
6 ответов

Ваша система, вероятно, имеет bash установленный в нескольких местоположениях, ли как различные версии bash или просто символьные ссылки.

which не действительно полезная команда в большинстве целей - это не действительно портативно или очень применимо в сценариях. В целом, type лучше. Идея позади which должен сделать a PATH ищите команду, которую Вы даете ему как аргумент.

$SHELL не обязательно отражает в настоящее время рабочую оболочку. Вместо этого $SHELL предпочтительная оболочка пользователя, которая обычно является той, начинаются /etc/passwd. При запуске другой оболочки после входа в систему Вы не можете обязательно ожидать $SHELL соответствовать текущей оболочке больше.

Как видете, $SHELL и which абсолютно не связаны. Ни один из них не скажет Вам, что окружает Вас, на самом деле работают.

Примечание стороны: К сожалению, соответствуя оболочке Вы в настоящее время работаете к местоположению в файловой системе, более твердо, чем можно было бы думать. Это вызвано тем, что двоичные файлы загружаются в память для выполнения, и в большинстве систем копия в памяти продолжит хорошо работать даже после удаления оригинала из диска (ядро может иметь в наличии дисковую копию в "неопределенности", пока это больше не действительно необходимо). Я не думаю, что существует любой портативный способ пойти об этом - необходимо было бы обратиться к платформе определенные методы. Например, на Linux, исследуя ссылку /proc/$$/exe должен дать Вам достойную идею того, что выполняет файл (где $$ идентификатор процесса Вашей рабочей оболочки). К сожалению, я не знаком с Солярисом, таким образом, я не могу помочь Вам там.

8
27.01.2020, 20:32

Другие ответы хороши, но мне нравится давать демонстрацию.

% echo $SHELL
/bin/zsh
% which bash
/bin/bash
  • Первая команда говорит мне, которым будет выполняться оболочка login когда Вы входите в систему. В моем случае, /bin/zsh.
  • Вторая команда говорит мне первое вхождение в моем $PATH bash команда может быть найдена.

Каждый не подразумевает второе, ни наоборот.

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

  • Оболочка по умолчанию на Солярисе /bin/bash
  • На Солярисе /bin символьная ссылка на ./usr/bin
  • Значение по умолчанию $PATH на Солярисе /usr/bin:/bin

Вот почему Вы видите это поведение.

8
27.01.2020, 20:32
  • 1
    Первая команда показывает Вашу оболочку по умолчанию, которая может быть оболочкой, которую Вы в настоящее время выполняете, но не всегда. –  jordanm 19.07.2012, 21:06
  • 2
    @jordanm: ах, да Вы правы. Фиксация. –  bahamat 19.07.2012, 21:11
  • 3
    Оболочка по умолчанию является/usr/bin/bash только на Солярисе 11. В соответствии с Солярисом 10 и более старый это-/bin/sh, который является реализацией Оболочки Bourne прежней версии. Начиная с Соляриса 11,/bin/sh является ksh93. ПУТЬ значения по умолчанию Соляриса для не пользователи root просто/usr/bin, имение и/usr/bin и / мусорное ведро не имело бы никакого смысла. –  jlliagre 20.07.2012, 02:29
  • 4
    @jlliagre: Вы правы относительно S10/S11.О нас /bin/ и /usr/bin Я соглашаюсь, что это не имеет смысла, но если у Вас нет a PATH объявленный это - то, что система дает Вам. –  bahamat 20.07.2012, 03:04
  • 5
    я просто сделал это на Солярисе 11 и сообщил точно, что я получил. –  bahamat 20.07.2012, 06:07

echo $SHELL показывает значение SHELL переменная среды. Это - пользовательская конфигурация, которую можно установить на путь к любимой интерактивной оболочке. Много программ вызывают $SHELL при выяснении вызвать оболочку.

Я думаю, что все оболочки оставляют эту переменную в покое, если она не сброшена, когда они запускают. Наборы Bash SHELL к его собственному пути, если переменная сброшена, когда она запускается. Наборы ATT ksh93 SHELL кому: /bin/sh если сброшено (даже если /bin/sh некоторая несвязанная оболочка). Ksh (все версии) проверяет ли SHELL rsh когда это запускается; если это, это запускается как ограниченная оболочка.

which bash показывает путь к исполняемому файлу удара (кроме тех случаев, когда он не делает — необходимо использовать type bash вместо этого). Более точно это ищет каталоги в $PATH для названного исполняемого файла bash.

echo $0, в интерактивной оболочке, показывает название команды, которое использовалось для вызова оболочки.

ps $$ (введенный от оболочки), отображает информацию о процессе оболочки ($$ расширен до идентификатора процесса оболочки).

ls -l /proc/$$/exe показывает полный путь исполняемому файлу для оболочки

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

% ./bash
$ echo $SHELL
/bin/zsh4
$ type bash
bash is /usr/bin/bash
$ echo $0
./bash
$ readlink /proc/$$/exe
/home/gilles/src/bash-git/bash
$ pwd
/home/gilles/src/bash-git
$ rm bash
$ echo $0
./bash
$ readlink /proc/$$/exe
/home/gilles/src/bash-git/bash (deleted)
1
27.01.2020, 20:32

which команда перерывает каталоги, указанные в Вашем $PATH переменная и возвраты первое соответствие, которое это находит, поскольку это будет файлом, который будет выполняться.

$SHELL возвращает каноническое имя файла, в настоящее время работающего, например, /bin/bash. /usr/bin/bash вероятно, ссылка на /bin/bash так или иначе. Использовать $SHELL найти название Вашего текущего интерпретатора команд.

0
27.01.2020, 20:32
  • 1
    Это не файл, в настоящее время работающий, это - оболочка по умолчанию. См. другие ответы. Кроме того, если это имеет значение я думаю, что символьная ссылка наоборот на Солярисе. –  Mikel 19.07.2012, 21:52
  • 2
    Более точно/bin/bash и/usr/bin/bash являются тем же самым файлом, / мусорное ведро, являющееся символьной ссылкой на/usr/bin. –  jlliagre 20.07.2012, 11:40
  • 3
    я признаю ошибку. $SHELL является оболочкой пользователя по умолчанию, не в настоящее время выполнением того. –  StarNamer 20.07.2012, 18:36
  • 4
    Относительно других ответов о which и type @Gilles и @jw013, при использовании tcsh оболочка, which встроенная команда и type не найден. Заключения: (1) Необходимо знать оболочку, которую Вы выполняете перед вводом команды. (2) Необходимо всегда помещать #!/bin/bash (или независимо от того, что необходимо) наверху сценариев. –  StarNamer 20.07.2012, 19:05

$SHELL набор переменной среды с путем к текущей оболочке входа в систему, которая в этом случае является ударом. Если необходимо было использовать chsh управляйте для переключения на некоторую другую оболочку (например, zsh), затем Вы видели бы /bin/zsh когда Вы работали echo $SHELL.

which команда на самом деле не имеет никакого отношения к определенной оболочке кроме того, чтобы быть ответственным за определение, какая программа была бы запущена, если бы необходимо было назвать ту программу непосредственно. У Вас могло бы быть несколько версий той программы в путях в Вашей переменной $PATH, которая могла быть выполнена. Причина Вы видите /bin/bash когда Вы работаете which bash то, потому что это - то, где система сначала находит bash программа в иерархии, которая является $PATH.

Можно работать which на любой команде, не только оболочке.

0
27.01.2020, 20:32
  • 1
    Зависит от Вашего определения "в настоящее время активных". Это - Ваша оболочка входа в систему, не оболочка, в которую Вы в настоящее время вводите. –  Mikel 19.07.2012, 21:48
  • 2
    Да, это - то, что я имел в виду; отредактированный.Спасибо! –  kenny 19.07.2012, 22:05

В соответствии с Солярисом, работает один простой способ знать, что окружает Вас, и что запустилось, это ptree, здесь моя оболочка является ksh:

$ ptree $$
408   /usr/lib/ssh/sshd
  1131  /usr/lib/ssh/sshd
    1132  /usr/lib/ssh/sshd
      1142  -ksh
        1146  ptree 1142

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

$ type bash
bash is /usr/bin/bash

Учитывая факт /bin и /usr/bin являются взаимозаменяемыми в соответствии с Солярисом (и это - тенденция на другом Unix как Ose также), возвратится ли удар типа /bin/bash или /usr/bin/bash зависит только от того, что сначала появляется на Вашем PATH и так или иначе не имеет значения так очень.

0
27.01.2020, 20:32

Теги

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