2つのパラメータを受け入れるスクリプトを作成します。最初のパラメータはプレフィックス文字列を表し、2番目のパラメータはパスを表します(絶対パスであると仮定)。作成するスクリプトは、次のことを行う必要があります。
ユーザーが1つの引数(プレフィックス文字列)のみを入力した場合は、作業ディレクトリ内の名前がそのプレフィックスで始まるすべてのファイルのリストを表示する必要があります。ユーザーが2つのパラメータであるプレフィックス文字列とパスを入力した場合。次に、スクリプトは、2 番目の引数で指定されたパス内で、プレフィックス名で始まるすべてのディレクトリのリストを表示します。スクリプトを実行する前に、スクリプトは作業ディレクトリの値を返す必要があります。
答え1
#!/bin/sh
( cd -- "${2:-.}" && ls -d -- "$1"*${2:+/} )
それは、
cd
2番目の引数が指定したディレクトリに移動するか、.
2番目の引数が指定されていないか空の場合。何もオプションとして解釈されない--
ようにしてください。cd
$2
ls -d
最初の引数で始まるすべての名前に対して実行されます。-d
上場を防ぐコンテンツディレクトリ名が一致するすべてのディレクトリ。何もオプションとして解釈されない--
ようにしてください。 2番目の引数が指定された場合、パターンは末尾の1を取得するため、ディレクトリ名のみが一致します。ls
$1
/
これはすべてサブシェルで発生するため、スクリプトの残りのcd
作業ディレクトリは変更されません(最後の文が意味するのはこれだと思います)。そのシェルがsource
スクリプトの実行に使用されていない限り、どのような状況でも、スクリプトは呼び出しシェルの作業ディレクトリを変更できず、サブシェルはこれが発生するのを防ぎます。したがって、作業ディレクトリは、スクリプトが実行される前の状態に復元(「返却」)されます。
答え2
これは不可能です。スクリプトを実行する前の作業ディレクトリを明示的に「元に戻す」ことはできません。なぜなら、スクリプトには当初は呼び出し元の作業ディレクトリを変更するための合理的な方法がないからです。望むより:スクリプトを使用して呼び出しシェルの作業ディレクトリをどのように変更できますか? 最後の文を無視して続行します。
#!/bin/sh
PREFIX="$1"
DIR="$2"
if [ -z "$DIR" ]; then;
ls -d -- "$1"*
else
cd -- "$DIR" &&
ls -d -- "$1"*/
fi
cd --
必ずしも必要ではありません。これが解決する問題は、aで始まる文字列がコマンドのオプション-
として解釈できることです。cd
質問によると、パスは絶対パスなので、常にで始まり、/
絶対で始まることはありません-
。 cd "$PATH"
十分でしょう。しかし、ls --
はい必ず必要。
ディレクトリはファイルタイプです。スクリプトの2つの引数形式は、ディレクトリを一覧表示する場合にのみ必要です。ファイルをリストするには、単一の引数形式のみが必要です。ディレクトリおよび一般ファイルに加えて、ファイルにはブロックデバイス、文字デバイス、ソケット、および名前付きパイプ(「fifos」とも呼ばれる)の特殊ファイルが含まれます。
Linux(および他の実装)はファイルタイプのリストを拡張します。 Linuxには「上記に該当しない」コマンドが含まれていますが、stat
コマンドは「奇妙なファイル」。