1

私はいくつかの ksh コードを調べていて、動作しないと思われる行に出くわしました。コードをテストするとうまくいきましたが、その理由はわかりません。

問題があれば、これは AIX 5.3 システムで実行されています。

コードの行は次のとおりです。

scriptname=$(\basename $0)

basenameコマンドの前にバックスラッシュがあるため、うまくいくとは思いませんでしたが、scriptname変数をテストしたところ、正しい値がありました。

コマンドラインでさらにテストを行いました。

$ echo $(\echo test)
test
$ echo $(\echo \test)
test
$ echo $(\e\c\h\o \test)
test
$ echo `\e\c\h\o \test`
test
$ echo $(\echo "\test")
est

コマンド置換の外で試してみましたが、思ったようには機能しませんでした。

$ \echo \testi\ng
testing
$ \echo "\testi\ng"
        esti
g

最後のものは、私にとって意味のある唯一のものです。

Kornshell はバックスラッシュを無視するだけですか、それともバックスラッシュの前の文字に変換するだけですか? コマンドラインのどこかに a を置くと\n改行になると思いましたが、どうやらそれが引用符で囲まれている場合、または\\n.

コマンドラインでバックスラッシュを使用してkshが行うことを誰か説明できますか?

いずれにせよ、最初に質問したコマンドを記述するより良い方法は次のようになると思います。

scriptname=$(basename $0)

それ以外の:

scriptname=$(\basename $0)

それは問題ですか?

前もって感謝します!

4

2 に答える 2

3

コマンド名の一部が引用符で囲まれている場合、ksh は実行対象を選択するときにエイリアスを無視します。

これが、元のスクリプトが \basename を使用していた理由だと思います。

于 2010-11-11T17:36:21.867 に答える
2

私は関連しているがわずかに異なる状況に遭遇しました。私は次のように書かれたいくつかのrmコマンドでシェルスクリプトを編集しています:

\rm ...

なぜ'\'がrmの前にあるのか疑問に思い、同様にそれが機能しているように見えることを見つけるためだけにそれを試しました。このサイトでは、これは、スクリプトが誤ってエイリアスを使用するのを防ぐために行われます(たとえば、rmが「rm-i」にエイリアスされている場合)。Stack Overflowに関する議論を最初に見つけたので、次の人を助けるためにこのビットを追加すると思いました。

于 2011-03-30T20:02:48.290 に答える