Bashエイリアス/関数とコマンドラインオプション

Bashエイリアス/関数とコマンドラインオプション

コマンドラインオプション-noautosaveを使用してneditを起動するようにエイリアスを設定したいと思います(テキストファイルは最大500 MBです)。単純に見えるもの:

alias nn="nedit -noautosave $1 &"

ただエラーが発生します。「許可が拒否されました」他のファイルと異なるエラー一致する ''' の検索中に予期しない EOF が発生しました。そして「予期しないファイルの終わり」

Googleで検索した後に見つけた解決策の1つは引用符を確認することですが、可能なエラーは表示されません。

また、関数宣言を試みました。

function nn () { nedit -noautosave $1 &}

また、同じエラーで失敗しました。

答え1

開こうとしているファイルの1つが指定されたサイズより大きい場合にのみ実行するには、以下を試してください。 (私は100Mを使用しましたが、サイズ制限を直接設定できます。nedit-noautosave

function nn() { 
    big=0;
    let big+=$(find "$@" -size +100M|wc -l)
    if [ $big -gt 0 ]; then
     nedit -noautosave -- "$@" &
    else
     nedit -- "$@" &
    fi
}

からman nedit

   --  Treats all subsequent arguments as file names,
       even if they start with a dash.  This is so NEdit
       can access files that begin with the dash
       character.

答え2

に引数を渡すことはできませんalias。 aを使う必要があるのでfunction正しい方向に行っているのです。functionコマンドを使用するとタイプミスが発生しました。ただし、次のいずれかが行われます。

$ nn () { nedit -noautosave -- "$@" & }

-または-

$ function nn() { nedit -noautosave -- "$@" & }

削除する必要がある場合は、unsetコマンドを使用してください。つまりunset -f nn

この方法で一連のファイルを開くには、代わりにを使用します"$@"$1

bashマニュアルページから抜粋

@      Expands to the positional parameters, starting from one.  When the 
       expansion occurs within double quotes, each parameter expands to a 
       separate word.  That is, "$@" is equivalent  to  "$1" "$2" ...  If 
       the double-quoted expansion occurs within a word, the expansion of 
       the first parameter is joined with the beginning part of the original 
       word, and the expansion of the last parameter is joined with the last
       part of the original word.  When there are no positional parameters,
       "$@" and $@ expand to nothing (i.e., they are removed).

はい

$ function nn() { nedit -noautosave -- "$@" & }

$ nn ~/.bashrc 
[3] 19830

答え3

エイリアスの目的全体が-noautosave編集するすべてのファイルにオプションを適用することである場合

alias nn='nedit -noautosave'

それだけで十分です。その後、次のように使用できます。

nn your_file &

答え4

alias nn="nedit -noautosave $1 &"

変数拡張は二重引用符として解釈されます。シェルコマンドラインでコマンドを実行すると、.bashrc位置引数(シェルに渡された引数)がないため、$1拡張は空の文字列で構成され、エイリアス値はですnnedit -noautosave &。だから実行するnn /path/to/file.txtとに拡張されますnnedit -noautosave & /path/to/file.txt。 「権限が拒否されました」というエラーメッセージは/path/to/file.txt実行できないために発生します。

エイリアスを使用してalias nn='nedit -noautosave $1 &'拡張を防ぎ、内部を保存できます。$1しかし、エイリアスはパラメータを使用せずにその場で置き換えられるため、これは良くありません。したがって、$1エイリアスを拡張すると、最初の位置引数に置き換えられます。これは以前より優れていません。

function nn () { nedit -noautosave $1 &}

これは基本的に正しいです。以前と同じエラーが発生した場合、エイリアスはnnまだ定義されており、同じ名前の関数よりも優先されます。unalias nnエイリアス定義を解放するために使用されます。

関数は次のように書く必要があります。

function nn () { nedit -autosave "$@" & }

ファイル名にスペースまたはワイルドカードがある場合は、二重引用符が必要です。"$@"置換を使用すると、"$1"複数のパラメータを渡すことができます。

関連情報