タグ付けされた質問 「shell」

シェルは、Unixのコマンドラインインターフェイスです。シェルにインタラクティブにコマンドを入力するか、スクリプトを記述してタスクを自動化できます。/ bin / shおよび最も互換性のあるシェル(ash、bash、ksh、zshなど)に適用される質問には、このタグを使用します。エラーのあるシェルスクリプトについては、ここに投稿する前にhttp://shellcheck.netで確認してください。

3
シェル:ifでパラメーター付きの関数を使用する
以下のコードを実行しようとしていますが、ifステートメントで関数を使用しようとすると、-bash: [: too many argumentsエラーが発生します。なぜそれが起こっているのですか? 前もって感謝します! notContainsElement () { local e match="$1" shift for e; do [[ "$e" == "$match" ]] && return 1; done return 0 } list=( "pears" "apples" "bananas" "oranges" ) blacklist=( "oranges" "apples" ) docheck=1 for fruit in "${list[@]}" do if [ notContainsElement "$fruit" "${blacklist[@]}" -a …

2
zshでの関数の呼び出しコンテキスト:bash `caller`と同等
bashでは、私は書くことができます: caller 0 呼び出し元のコンテキストを受け取ります: 行番号 関数 スクリプト名 これはデバッグに非常に役立ちます。与えられた: yelp () { caller 0; } 次に、yelpどのコード行に到達しているかを確認するために書き込むことができます。 私が実装することができますcaller 0でbashのように: echo "${BASH_LINENO[0]} ${FUNCNAME[1]} ${BASH_SOURCE[1]" どのように私は同じ出力を得ることができますcaller 0ではzsh?

1
$ @のパラメーター展開はshシェルでサポートされていませんか?
私はAUに関する質問への回答を投稿しました$@が、shシェルでのパラメーター展開が機能しないことがわかりました。 <infile xargs -d'\n' sh -c 'echo "${@%%/*}"' _ しかし、それはで正常に動作しbashます。これはshシェルの予想される動作ですか、そこでシェルを拡張するにはどうすればよいですか? さらに、-n1オプションでxargs一度にコマンドに渡すことができるのは1行だけであることはわかっていますが、sh展開できるかどうかに興味がありました$@。 <infile xargs -d'\n' -n1 sh -c 'echo "${0%%/*}"' infile 含む: A1 /B1/C1 A 2/B2/C2 A3/B3/C3
8 bash  shell  dash 


2
tbzファイルへのファイルの追加
何千もの.tbzアーカイブファイルを更新する方法を探しているので、これをシェルスクリプトで実行します。それぞれに1つのファイルを追加する必要があります。 私の質問は、各tbzの内容を抽出せずに、含まれているtarに含まれている新しいファイルで再圧縮することなく、これを行うより速い方法はありますか?コマンドはどのように見えますか? ありがとう

2
変数に改行が含まれているかどうかをテストします(POSIX)
一部のシェルはこの種のテストを受け入れることを知っています: t() { [[ $var == *$'\n'* ]] && res=yes || res=no printf '%s ' "$res"; } var='ab cd' t var='abcd' t echo 実行時: $ bash ./script yes no POSIX(ダッシュ)と同等の機能とは 以下は信頼できるテスト方法ですか? nl=' ' t() { case "$var" in *$nl* ) res=yes ;; * ) res=no ;; esac printf '%s ' …

2
grub2 configからのコマンド「exec tail -n +3 $ 0」にはどのようなロジックがありますか?
カスタムメニューエントリを作成すると、次のコマンドが表示されなくなります。 exec tail -n +3 $0 ターミナルで試してみましたが、奇妙な結果になり、理解できません。このコマンドが正確に何をするのか、なぜgrubがそれを必要とするのか理解できません。説明して頂けますか?
8 shell  grub2  tail  exec 

6
終了コードではなく戻り値に基づいてパイプラインを構築するエレガントな方法?
ステータスコードが役に立たない場合、標準出力からの出力に基づいてパイプラインを構築する方法はありますか? ユースケースではなく、シェルスクリプトの範囲内の質問に答える方がいいと思います。私がやろうとしていることは、国と言語コードに基づいて名前を推測することにより、リポジトリで利用可能な最も具体的なパッケージを見つけることです。 これを例にとると、 $PACKAGE1=hunspell-en-zz $PACKAGE2=hunspell-en 最初の推測はより適切ですが、存在しない可能性があります。この場合、最初のオプション()が存在しないため、hunspell-en($PACKAGE2)を返します。hunspell-en-zz$PACKAGE1 apt-cacheのパイプライン apt-cacheコマンドが実行できる場合は常に、シェルによって終了コード0として定義されるコマンドが成功を返します(のドキュメントからapt-cache) apt-cacheは通常の操作ではゼロを返し、エラーの場合は10進数の100を返します。 これにより、パイプラインでのコマンドの使用がより困難になります。通常、私は404に相当するパッケージ検索でエラーが発生することを期待しています(curlまたはで発生しますwget)。パッケージが存在するかどうかを確認し、存在しない場合は別のパッケージにフォールバックしたい。 最初のコマンドが成功を返すため、これは何も返しません(したがって、||neverのrhs は実行されません)。 apt-cache search hunspell-en-zz || apt-cache search hunspell-en apt-cache search 2つの引数 これは、apt-cacheその引数のANDを取るため、何も返しません。 apt-cache search hunspell-en-zz hunspell-en のドキュメントから apt-cache 別々の引数を使用して、AND結合された複数の検索パターンを指定できます。 したがって、これらの引数の1つが明らかに存在しないため、これは何も返しません。 質問 apt-cacheタスクに戻りコードが役に立たない場合に見られるような規則を処理するためのシェルイディオムは何ですか?そして、成功はSTDOUT上の出力の存在によってのみ決定されますか? に似ている 何も見つからなかったときに検索を失敗させる どちらも同じ問題に起因しています。そこで選択された答えはfind -z、残念なことに、ここで適用できる解決策ではなく、ユースケース固有のものです。ヌル終了を使用せずにイディオムやパイプラインを構築することについての言及はありません(のオプションではありませんapt-cache)

1
ネストされたコマンドの格納されたリターンコードで終了すると、DashとBashで異なるリターンコードが発生するのはなぜですか?
ランニング bash -c 'bash -c "echo test1; exit 1;" &> /tmp/x; buildresult=$?; tail -n 100 /tmp/x; exit $buildresult;' で結果test1コンソールに印刷されてecho $?印刷するには1、コマンドが内部でどのように返す必要がありますので、正確である私の理解でいる[b/d]ash -cのに対し、返さ dash -c 'dash -c "echo test1; exit 1;" &> /tmp/x; buildresult=$?; tail -n 100 /tmp/x; exit $buildresult;' 結果は同じ出力になりますが、0に従って戻りますecho $?。 シェルとポータブルシェルプログラミングの理解を深めるために、この違いを理解したいと思います。 Ubuntu 17.10(Artful Aardvark)でbash4.4.12およびdash0.5.8-2.3ubuntu1 を使用しています。

3
/間でコンテンツフォルダをコピーします。およびLinuxの/ *
私が読んだフォルダからコンテンツをコピーするには、次のように使用します。 cp -rfva ../foldersource/. ./ しかし、これも機能します cp -rfva ../foldersource/* ./ 違いはありますか? たとえば、でフォルダからコンテンツを削除したい場合。: rm -rf ../foldersource/. 私はエラーが出ます: rm: rejet delete folder '.' or '..': アスタリスクを付けても大丈夫です rm -rf ../foldersource/* だから、アスタリスクはどこでも機能するより良いオプションですか?
8 linux  shell 

1
bashで独自のcp関数を作成する
割り当てについては、関数cp(コピー)と同じ基本機能を持つbash関数を巧みに書くように求められます。1つのファイルを別のファイルにコピーするだけなので、複数のファイルを新しいディレクトリにコピーする必要はありません。 私はbash言語に慣れていないため、プログラムが機能しない理由を理解できません。元の関数は、ファイルが既に存在する場合はファイルの上書きを要求するので、それを実装しようとしました。それは失敗します。 ファイルは複数行で失敗しているように見えますが、最も重要なのは、コピー先のファイルがすでに存在するかどうかを確認する状態です([-e "$2"])。それでも、その条件が満たされた場合にトリガーされるはずのメッセージ(ファイル名...)が表示されます。 誰かがこのファイルを修正するのを手伝ってくれませんか?おそらく私の言語の基本的な理解に役立つ洞察を提供していますか?コードは以下の通りです。 #!/bin/sh echo "file variable: $2" if [-e file]&> /dev/null then echo "The file name already exists, want to overwrite? (yes/no)" read | tr "[A-Z]" "[a-z]" if [$REPLY -eq "yes"] ; then rm "$2" echo $2 > "$2" exit 0 else exit 1 fi else cat …

5
効率的にマージ/ソート/ユニークな多数のテキストファイル
私は素朴なことを試しています: $ cat * | sort -u > /tmp/bla.txt これは失敗します: -bash: /bin/cat: Argument list too long したがって、(巨大な一時ファイルを作成する)のようなばかげた解決策を避けるために: $ find . -type f -exec cat {} >> /tmp/unsorted.txt \; $ cat /tmp/unsorted.txt | sort -u > /tmp/bla.txt 私は使用してファイルを1つずつ処理することができましたが(これにより、メモリ消費が削減され、ストリーミングメカニズムに近づくはずです)。 $ cat proc.sh #!/bin/sh old=/tmp/old.txt tmp=/tmp/tmp.txt cat $old "$1" | sort -u > …
8 shell  sort  uniq 

3
#!/ bin / bash内。月の平日の最初の日付を取得するUnixコマンド
来月の最初の日曜日、来月の最初の月曜日、来月の最初の火曜日、来月の最初の水曜日などを取得するストレートなUnixコマンドを探しています。 私は完全な日付形式でそれらを必要とします(時間は必須ではありません) 2、3、4などの数値を取得できます。数値だけが必要ではないため、日付形式(日、月、年を含む)で必要になります。 $ NEXT_MONTH=`date +'%m %Y' -d 'next month'` $ echo $NEXT_MONTH 04 2017 $ NEXT_SUNDAY=`cal $NEXT_MONTH | awk 'NF==7 && !/^Su/{print $1;exit}'` $ echo $NEXT_SUNDAY 2 メールグループの通知を送信するには、これらの日付が必要です。 例:来月の第1土曜日は以下のようになります。 $ firstofmonth=$(date -d '+1 months' '+%Y%m01') 20170401 $ firstsaturday=$(date -d "$firstofmonth" '+%Y-%m')-$((7 - \ $(date -d "$firstofmonth" '+%u') )) 2017-04-1
8 shell  date 

3
シェルスクリプトでの非常に大きな数の追加
二つの数が2つの異なるファイルに格納されていると仮定し、a.txtとb.txt。 各数値は、が使用する数値データタイプでサポートされないほど十分に大きい(30桁を超える)bash。 それらをシェルに追加するにはどうすればよいですか?

1
$ PATHでの検索は内部ではどのように機能しますか?
そこにいる道の人を教えてウェブ上であまりにも多くの記事/リソースHOW環境変数を設定するためにPATH、彼らは短いの手使用できるように、javaまたはpython代わりに、コマンドラインインタフェースに絶対パスのなど。 私が知りたいのは、コマンドを入力してEnter キーを押すと、背後にあるものです(ブラウザーでURLを入力すると何が起こるかと同様です)。 これが私の推測です: コマンドを読み取ります(正しい引数を取得するために標準入力を解析/前処理します$@) コマンド検索 コマンドの実行(プログラムの開始、メモリの消費、シェルへのstdout / stderr) 関連する環境変数(例えばによってエミュレータを再レンダリングする$PS#、$PROMPTなど) 私が最も理解したいのはコマンド検索です。明らかに、$PATHいくつかのバックグラウンド関数によって消費され、区切り文字として:/ ;で区切られた後、何が起こりましたか?ハッシュテーブル(キー:ファイルのベース名、値:ファイルの絶対ディレクトリ名)を使用して、これらのPATHまたはその他のフックの下にバイナリファイルを保存しますか? 注:[ -z hash [command] ]コマンドが現在の環境で使用できるかどうかを確認するために使用できるので、当初はハッシュテーブルであると思っていましたが、使用するhash | grep pythonとwhich python、期待どおりに動作している間、出力から何も得られません。(メカニズムはシェル固有の可能性があると思いますが、それについてもっと洞察を得たいです。)
8 shell  path 

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.