エイリアスによってシャドウされているコマンドを実行する


164

bashに次のエイリアスがあるとしますalias ls='ls --color=auto'--そして、lsオプションなしで普通に呼び出したいと思います。それを行う唯一の方法は、エイリアスを解除し、コマンドを実行してから再びエイリアスにすることですか?または、気の利いたトリックや回避策がありますか?


2
以下の答えのいくつかについてのメモ:「コマンド」はこれを達成する唯一の安全な方法です。たとえば、「。」または、「ソース」ビルトインは、スクリプト定義の関数によってオーバーライドされる場合があります。「コマンド」または、「コマンドソース」は、代わ​​りにスクリプト定義関数を呼び出さずにソースを安全に実行する唯一の方法です。バックスラッシュメソッド「\。」を含む他の選択肢は機能しません。もちろん、フルパスを指定して呼び出すことができる「/ bin / source」の選択肢はありません。
クレイトン

回答:


211

バックスラッシュの前にエイリアスを無効にすることもできます: \ls

編集:同じことを行う他の方法は次のとおりです。

Mikelにcommand lsよる「コマンド」を使用します。

完全なパスを使用してください:/bin/lsにつきとしてuther

コマンドを引用します:"ls"または'ls'Mikelコメントに従って。

を使用して、そのターミナルセッションのエイリアスを一時的に削除できunalias command_nameます。


これが私の標準的な方法です。
ncmathsadist

非常に素晴らしい、tcshでもうまく動作します
レボン

10
この方法は非常に便利です。関数ではなくエイリアスのみをバイパスするため、commandor とは異なりbuiltinます。
ミケル

1
l\s同じことをするようです。この動作はバグですか、それとも機能ですか?
ニクラスB.

4
それは「機能」です。引用符で囲まれていないエイリアスのみが展開されます。そのため、引用符で囲むか、好きな場所にバックスラッシュを使用できます。参照してくださいbashのエイリアス参照を
ミケル

79

それがcommandコマンドの目的です。

試して

command ls

これは、エイリアスと関数をバイパスするようシェルに指示します。

この方法は、bashzsh、およびash / dashでサポートされています。


2
最良の答えは、なぜ最も支持されていないのですか?:) +1
0xC0000022L

11
バックスラッシュ方式の8倍の文字数を追加するため
JoelFan

1
@STATUS_ACCESS_DENIEDこれはtcshでは動作しません(したがって、おそらくcshでも動作しません)。`\`メソッドは
レヴォン

3
バックスラッシュ機能は安全ではありません。同様の名前のエイリアスに対する保護は提供しますが、同様の名前の関数に対する保護は提供しません。
デジェイクレイトン

2
@JoelFan私はむしろ少数の余分なキャラクターを持ち、私のスクリプトを誰でも簡単にフォローして作業できるようにします。直感的でなく、見逃しやすく、十分に文書化されておらず、機能をバイパスするために機能しない不可解なスラッシュではありません。
デニス

19

エイリアスは、定義済みのショートカットです。この例では、定義されるエイリアスはstringでls、これが実行されls --color=autoます。その動作が望ましくない場合はls、絶対パスを使用してバイナリを呼び出すことができます。

その/bin/lsため、定義したエイリアスではないため、実行すると色のない出力が生成されます。

エイリアスを別のエイリアスに変更したりls、カラーパラメータなしで実行される新しいエイリアスを追加したりすることもできます。


2
コマンドがどこにあるかを知る必要があります。一部のシステムでは、/binとの間の分割/usr/binは任意です。
キーストンプソン

@KeithThompsonそのために、次のwhichコマンドに使用できますwhich ls
cst1992

@ cst1992:(whichまたはtype)を使用する場合、$PATH;を介して検索を行います。あなたにもちょうど使用することがありますls\lsではなく、パスを指定します。
キーストンプソン

10

@utherの答えに基づいた別の方法は、実行可能ファイルのパスを自動的に見つけるために、$(which ...)または`which ...`(backticksを使用して``)を使用することです。これはで動作しbashます:

$(which ls)

`which ls`

間違いなく、単にコマンドの前にaを付けるだけ\ではるかに短くなります。

更新エイリアスコマンドで「which」を使用する方法によると、これはまったく信頼できないようです。


括弧は何のためですか?`which ls`バイナリを直接実行するつもりだと思います。
アミシン

2
@amyassin:両方の構文は同等です。(ところで、どのようにバックフォーマットをコードのフォーマットに入れましたか?)
krlmlr

実際、(which ls)私にとってはうまくいきませんでした(Ubuntu 12.04 LTS)。また、逆戻りが難しいため、エスケープしました:\ `which ls \`。そこに着くには多くの編集が必要でした:)
amyassin

1
@ user946850「コードスパン内にリテラルバックティック文字を含めるには、開始および終了の区切り文字として複数のバックティックを使用できます」。ソース:Markdown Reference
ミケル

@amyassin:を追加しました$か?
krlmlr

2

個人的には、コマンドと同じ名前のエイリアスを定義することは避けているため、ls常に実際のコマンドを呼び出します。私のようなオプションのさまざまな組み合わせのためのエイリアスや機能を持っているllllg。(つまりunalias ls.bashrcまたはで必要.cshrcです。)

私が好むオプションに関するOSの仮定(lsコマンド自体の設計者の仮定を無効にする)は、私自身の個人的な好みとほとんど一致しないことがわかります。私はたまたまの外観が嫌いでls --color=auto、その読みやすさは白地に黒と黒地に白の間で大きく異なります。

YMMV、およびその他のソリューションはもちろん、知っておくと良いでしょう。


1

コマンドを大文字で入力するとうまくいくようLSです。


4
どのシェル、どのオペレーティングシステム、どの端末などに?
ミケル

@Mikel「ls」として「sl」を提供するパッケージ「sl」があります。Ubuntuでbashが提供するヒントは、「LS」は「sl」によって提供されるとも述べています。
イズカタ

1
これは、Mac OS X 10.7のbash 4(Finkと共にインストール)です。また、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では動作しません。
ジャンダー
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.