-1

私はしばらくの間、これに頭を悩ませてきました。とてもシンプルに見えますが、私はそれを機能させることができません。それが違いを生むならば、これは根ざしたアンドロイドタブレットにあります。通常のLinuxシステムでsudoの動作を模倣しようとしています。私はbashスクリプトに関してはあまり経験がないので、これはおそらく非常に簡単です。これは2つの部分からなる問題です。

これがエイリアスと呼ばれるbashスクリプト(の一部)です。通常はbashrcから供給されます。問題は、カスタムsudoコマンドがこのスクリプトで定義されたエイリアスにアクセスできるようにすることです。

#! /system/xbin/bash

alias ls='busybox ls --color=auto'

function sudo() {
    su -c 'source /system/etc/bash/aliases && "$@"'
} 

したがって、シェルからsudoを呼び出すと、まったく何も出力されません。上記のスクリプトの最後にあるクイック「echook」は、sudoを実行しようとしたときにソースコマンドが実行されていることを示しています。しかし、「&&」の後には何も行われていないようです。エコーすらしません。ランダムなファイル名に触れても機能しないので、リダイレクトされているなどの問題はないようです。'&&'を'||'に置き換えてみました しかし、それも機能しません。

問題のパート2は、デバッグ時に発生しました。シェルから以下を呼び出す:

su -c 'source /system/etc/bash/aliases && ls'

... lsが呼び出される直前にエイリアスファイルがソースされていたとしても、色なしでlsを出力します。今、私は完全に混乱しています。

4

1 に答える 1

3

差し迫った問題は、コマンドを一重引用符で囲んでいることです。

su -c 'source /system/etc/bash/aliases && "$@"'

"$@"一重引用符は、が関数内で展開されていないことを意味するため、リテラルコマンドを実行しています...

source /system/etc/bash/aliases && "$@"

...そして"$@"空の文字列に展開されます。引用符で囲まれた引数を処理する必要なしに生きることができる場合は、次のようにすることができます。

    su -c "source /system/etc/bash/aliases && $*"

"..."一重引用符の代わりに二重引用符()を使用していることに注意してください。ただし、これが原因で、これでも必要な処理が実行されない場合があります。

シェルが対話型でない場合、shoptを使用してexpand_aliasesシェルオプションが設定されていない限り、エイリアスは展開されません(以下のシェルビルトインコマンドのshoptの説明を参照してください)。

一般に、シェルスクリプトでエイリアスを使用することは避けようとします。これは、スクリプトが環境(またはこの場合はターゲットユーザーの環境)に大きく依存するためです。エイリアスの代わりにシェルスクリプトを使用してコマンドをカプセル化すると、通常、より堅牢で移植性の高いソリューションになります。

于 2013-01-13T13:55:15.203 に答える