Запустите команду, которая затенена псевдонимом

164

Допустим, у меня есть следующий псевдоним в bash alias ls='ls --color=auto'- и я хочу назвать обычный lsбез опций. Единственный способ сделать это - unalias, выполнить команду, а затем снова псевдоним? Или есть какой-нибудь изящный трюк или обходной путь?

Миржан Иркегулов
источник
2
Просто обратите внимание на некоторые ответы ниже: «команда» - ЕДИНСТВЕННЫЙ безопасный способ сделать это. Например, "." или встроенный «источник» может быть переопределен определенной скриптом функцией. "команда" или «источник команд» - это единственный способ безопасного выполнения источника без вызова функции, определенной сценарием. Ни одна из других альтернатив, включая метод обратной косой черты "\.", Не работает, и, конечно, нет альтернативы "/ bin / source", которую вы можете вызвать, указав полный путь.
Деджей Клейтон,

Ответы:

211

Вы также можете использовать префикс обратной косой черты, чтобы отключить псевдоним: \ls

Изменить: Другие способы сделать то же самое включают в себя:

Используйте «команду»: command lsсогласно Mikel .

Используйте полный путь: /bin/lsсогласно Утеру .

Цитировать команду: "ls"или 'ls'согласно комментарию Микеля.

Вы можете временно удалить псевдоним для этого терминального сеанса с unalias command_name.

не сейчас
источник
Это мой стандартный способ сделать это.
ncmathsadist
очень хорошо, также хорошо работает с tcsh
Левон
10
Этот способ очень полезен. Он только обходит псевдонимы, а не функции, что отличает его от commandили builtin.
Микель
1
Кажется, l\sделает то же самое. Это поведение ошибка или особенность?
Никлас Б.
4
Это «фича». Только псевдонимы без кавычек расширяются. Таким образом, вы можете поместить его в кавычки или использовать обратную косую черту где угодно. Смотрите ссылку на псевдонимы bash .
Микель
79

Для этого и нужна commandкоманда.

Пытаться

command ls

Это говорит оболочке обойти псевдонимы и функции.

Этот способ поддерживается bash , zsh и ash / dash.

Mikel
источник
2
Лучший ответ, почему это не самый одобренный, хотя? :) +1
0xC0000022L
11
Потому что он добавляет 8-кратное количество символов в качестве метода обратной косой черты
JoelFan
1
@STATUS_ACCESS_DENIED Это также не работает с tcsh (и, следовательно, предположительно не с csh). Метод `\` делает
Левон
3
Функция обратной косой черты небезопасна. Хотя он обеспечивает защиту от псевдонимов с одинаковыми именами, он не обеспечивает защиту от функций с одинаковыми именами.
Деджей Клейтон,
2
@JoelFan Я бы предпочел иметь несколько лишних символов, чтобы мои сценарии были легко понятны и работали для всех. Вместо загадочной косой черты, которая не является интуитивно понятной, легко пропускаемой, плохо документированной и не работает для обхода функций.
Деннис
19

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

Таким образом, выполнение just /bin/lsприведет к выводу без цвета, потому что это не определенный вами псевдоним.

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

Джордж М
источник
2
Вы должны знать, где находится команда. В некоторых системах разделение между /binи /usr/binявляется произвольным.
Кит Томпсон
@KeithThompson Для этого вы можете использовать whichдля некоторых команд: which ls.
cst1992
@ cst1992: Если вы собираетесь использовать which(или type), он выполняет поиск через $PATH; Вы могли бы просто использовать lsили \lsвместо того, чтобы указывать путь.
Кит Томпсон
10

Другой способ, основанный на ответе @ uther, заключается в использовании $(which ...)или `which ...`(с помощью обратных кавычек ``) автоматического поиска пути исполняемого файла. Это будет работать в bash:

$(which ls)

`which ls`

Несомненно, простой префикс команды с \намного короче.

ОБНОВЛЕНИЕ : Согласно Как использовать `which` для команды с псевдонимом? это не кажется надежным на всех.

krlmlr
источник
Для чего нужны скобки? Я предполагаю, что вы `which ls`хотите выполнить двоичный файл напрямую.
amyassin
2
@amyassin: оба синтаксиса эквивалентны. (Кстати, как вы получили обратные ссылки в форматирование кода?)
krlmlr
На самом деле, у (which ls)меня это не сработало (на Ubuntu 12.04 LTS), и неприятности были тяжелыми, я просто избежал их: \ `which ls \`. Чтобы добраться туда, потребовалось много редактирования :)
amyassin
1
@ user946850 «Чтобы включить буквальный символ обратного течения в диапазон кода, можно использовать несколько обратных тиков в качестве открывающих и закрывающих разделителей». Источник: Markdown Reference .
Микель
@amyassin: Вы добавили $?
krlmlr
2

Лично я просто избегаю определения псевдонимов с теми же именами, что и команды, поэтому lsвсегда вызываю саму команду. У меня есть псевдонимы или функции для различных комбинаций опций , таких как l, llи lg. (Это означает, что я нуждаюсь unalias lsв моем .bashrcили .cshrc.)

Я нахожу, что предположения ОС относительно того, какие варианты я бы предпочел (переопределяя предположения разработчиков самой lsкоманды), редко соответствуют моим личным вкусам. Мне не нравится внешний вид ls --color=auto, и его разборчивость может сильно различаться между черным на белом и белым на черном.

YMMV, и другие решения, конечно, еще полезно знать.

Кит Томпсон
источник
1

Кажется LS, что ввод команды в верхнем регистре работает , хотя я не совсем уверен, почему.

asmeurer
источник
4
В какой оболочке, в какой операционной системе, в каком терминале и т. Д.?
Микель
@Mikel Существует пакет "sl", который предоставляет "sl" как "ls". Советы, которые Bash дает в Ubuntu, также говорят, что «LS» предоставляется «sl».
Изката
1
Это bash 4 (устанавливается вместе с Fink) в Mac OS X 10.7. Это также работает для других команд, которые я назвал как rm и grep.
asmeurer
3
Это просто шутка :) со страницы mn:LS - display animations aimed to correct users who accidentally enter LS instead of ls.
amyassin
7
Я думаю, что это работает для Mac OS X, потому что его файловая система нечувствительна к регистру по умолчанию. Это не будет работать на других Unix.
Декабрь