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

シェルスクリプト、シェルによって解釈される実行可能ファイル(bash、zshなど)に関する質問。

5
zshで独自のシェル関数を定義およびロードする方法
zshで独自のシェル関数を定義して実行するのに苦労しています。公式ドキュメントの指示に従い、最初に簡単な例を試してみましたが、うまくいきませんでした。 フォルダーがあります: ~/.my_zsh_functions このフォルダには、私はと呼ばれるファイル持っているfunctions_1とrwxユーザー権限を。このファイルには、次のシェル関数が定義されています。 my_function () { echo "Hello world"; } FPATHフォルダーへのパスを含めるように定義しました~/.my_zsh_functions: export FPATH=~/.my_zsh_functions:$FPATH または.my_zsh_functionsでフォルダが機能パスにあることを確認できますecho $FPATHecho $fpath ただし、シェルから次のことを試してみると: > autoload my_function > my_function 私は得る: zsh:my_test_function:関数定義ファイルが見つかりません 電話をかけるために他に必要なことはありますmy_functionか? 更新: これまでの回答は、zsh関数を使用してファイルを調達することを示唆しています。これは理にかなっていますが、少し混乱しています。それらのファイルがどこにあるかをzshは知らないのFPATHですか?その時の目的は何autoloadですか?
54 shell-script  zsh 

4
シャットダウンする前にコマンドを実行する
コンピューターがシャットダウンする直前に単純なコマンドを実行したい(タイミングは必須ではない)。 起動には、/ etc / rc.localを使用できます。シャットダウンに似たようなものはありますか? メニューから統合シャットダウンボタンを引き続き使用したいことに注意してください。つまり、端末からシャットダウンするたびにカスタムスクリプトを使用したくありません-自動である必要があります。

14
未使用のローカルポートを見つける最も簡単な方法は何ですか?
未使用のローカルポートを見つける最も簡単な方法は何ですか? 現在、私はこれに似たものを使用しています: port=$RANDOM quit=0 while [ "$quit" -ne 1 ]; do netstat -a | grep $port >> /dev/null if [ $? -gt 0 ]; then quit=1 else port=`expr $port + 1` fi done それはひどく回り道をしているので、私が見逃したビルトインのようなもっと簡単な道があるのだろうかと思っています。

5
ファイルがハードリンクかシンボリックリンクかを判断しますか?
ファイルへのファイル名/パスを取得し、ファイルがシンボリックリンクかハードリンクかを判断するシェルスクリプトを作成しています。 唯一のものは、それらがハードリンクかどうかを確認する方法がわかりません。テストファイルとして使用するために、ハードリンクとシンボリックリンクの2つのファイルを作成しました。しかし、ファイルがハードリンクであるか、シェルスクリプト内のシンボリックであるかをどのように判断しますか? また、シンボリックリンクの宛先パーティションを見つけるにはどうすればよいですか?別のパーティションにリンクするファイルがあるとしましょう。元のファイルへのパスをどのように見つけますか?

4
不要な猫を気にする必要がありますか?
多くのコマンドラインユーティリティは、パイプまたはファイル名引数から入力を取得できます。長いシェルスクリプトのcat場合、特に最初のコマンドに複数行の引数が必要な場合は、チェーンを開始すると読みやすくなります。 比較する sed s/bla/blaha/ data \ | grep blah \ | grep -n babla そして cat data \ | sed s/bla/blaha/ \ | grep blah \ | grep -n babla 後者の方法は効率が悪いですか?その場合、スクリプトが実行されるかどうか、たとえば1秒間に1回実行されるかどうかを考慮するのに十分な違いはありますか?読みやすさの違いはそれほど大きくありません。


1
「…」、「…」、「$」…、および「$」…引用符の違いは何ですか?
時々私はスクリプトがいくつかのテキストを引用し、これらのさまざまな方法のすべてを使用して参照してください"..."、'...'、$'...'、と$"..."。なぜ非常に多くの種類の引用が使用されているのですか? それらは異なる振る舞いをしたり、それらの中で私ができることに影響を与えますか?

4
配列から要素を完全に削除するにはどうすればよいですか?
unset array[0]要素を削除しますが、まだecho ${array[0]}私がnull値を取得した場合、これを行う他の方法がありますが、配列の要素に次のようなスペースが含まれている場合 array[0]='james young' array[1]='mary' array[2]='randy orton' しかし、これらも仕事をするのに失敗します array=${array[@]:1} #removed the 1st element 今、私は新しい配列を次のようにしたい array[0]='mary' array[1]='randy orton' スペースは割り当て後に問題を引き起こし、実際の配列は置換のようになります。 array=(mary randy orton)


4
なぜ(exit 1)スクリプトを終了しないのですか?
スクリプトがありますが、必要なときに終了しません。 同じエラーのスクリプトの例は次のとおりです。 #!/bin/bash function bla() { return 1 } bla || ( echo '1' ; exit 1 ) echo '2' 私は出力を見ると仮定します: :~$ ./test.sh 1 :~$ しかし、私は実際に見ます: :~$ ./test.sh 1 2 :~$ ()何とか連鎖するコマンドは、スコープを作成しますか?exitスクリプトではない場合、何が終了しますか?

2
bashスクリプトでstderrメッセージを抑制します
次の(少し馬鹿げた)スクリプト名 'test1.sh'を検討してください。 #/bin/bash # sleep 10 & echo sleep pid = $! pkill sleep 実行すると、エコーの出力だけでなく、stderrでのスリープの終了に関するbashのレポートも取得されます。 $ ./test1.sh sleep pid = 3551 ./test1.sh: line 5: 3551 Terminated sleep 10 この場合、stderrへの印刷を抑制したいと思います。次のように、コマンドラインで実行できることを知っています。 $ ./test1.sh 2> /dev/null ...しかし、スクリプト内からそれを抑制する方法はありますか?(私はそれを2番目のスクリプトでラップしてラッパーにリダイレクトさせることができることを知っていますが、もっと簡単なものが必要です...)

7
将来変更されたときに害を引き起こすことに対してbashスクリプトを強化するにはどうすればよいですか?
そこで、ホームフォルダー(より正確には、書き込みアクセス権のあるすべてのファイル)を削除しました。起こったことは、私が持っていたことです build="build" ... rm -rf "${build}/"* ... <do other things with $build> bashスクリプトで、不要になった後$build、宣言とそのすべての使用を削除しrmます。ただし、Bashは喜んでに拡張されrm -rf /*ます。うん。 私は愚かだと感じ、バックアップをインストールし、失った仕事をやり直した。恥を乗り越えようとしています。 さて、私は疑問に思う:そのような間違いが起こらないように、または少なくとも可能性が低いようにbashスクリプトを書くためのテクニックは何ですか?たとえば、私が書いていた FileUtils.rm_rf("#{build}/*") Rubyスクリプトでは、インタープリターはbuild宣言されていないことについて不平を言っていたので、言語が私を保護します。 rm相関関係に加えて、bashで検討したこと(関連する質問の多くの回答が言及しているように、問題ではありません): rm -rf "./${build}/"* それは私の現在の仕事(Gitリポジトリ)を殺したでしょうが、それ以外は何もありません。 rm現在のディレクトリ外で動作する場合、そのバリアント/パラメータ化には相互作用が必要です。(見つかりませんでした。)同様の効果。 それとも、この意味で「堅牢」なbashスクリプトを作成する他の方法はありますか?
46 bash  shell-script  rm 

3
複数のプラットフォームで正しいtmpディレクトリを見つける
作業のために一時ファイルを作成し、それ自体をクリーンアップする必要があるスクリプトがあります。私の質問は、一時ファイルの正しいベースディレクトリを見つけることです。 スクリプトは、Git Bash(Windows)、Solaris、Linux、OSXなどの複数のプラットフォームで動作する必要があります。プラットフォームごとに、優先される一時ディレクトリの表現が異なります。 Windows:(%TMP%および場合によっては%TEMP%) OSX: $TMPDIR Linux、UNIX:あるはず$TMPDIRですが、私が試した複数のシステムでは設定されていないようです したがって、私のスクリプトでは、この定型句を追加しました。 if test -d "$TMPDIR"; then : elif test -d "$TMP"; then TMPDIR=$TMP elif test -d /var/tmp; then TMPDIR=/var/tmp else TMPDIR=/tmp fi これは面倒です。もっと良い方法はありますか?

13
システム管理のために複数のディレクトリを切り替える高速なコマンドラインの方法は何ですか?
システム管理のために複数のディレクトリを切り替える高速なコマンドラインの方法は何ですか?とを使用pushd .しpopdてトグルすることができますが、スタックの一番下から永久にポップするのではなく、複数を保存して循環させる場合はどうなりますか?

8
POSIX必須ユーティリティがシェルに組み込まれていないのはなぜですか?
この質問の目的は、特定のコンピューティング問題を解決することではなく、好奇心に答えることです。問題は、なぜPOSIXの必須ユーティリティがシェル実装に組み込まれていないのですか? たとえば、基本的にいくつかの小さなテキストファイルを読み取り、それらが適切にフォーマットされていることを確認するスクリプトがありますが、かなりの量の文字列操作のために、マシンで実行するのに27秒かかります。この文字列操作は、さまざまなユーティリティを呼び出すことで数千の新しいプロセスを作成するため、速度が低下します。私はユーティリティのいくつかは、すなわち、中に建設された場合のことをかなり確信していますgrep、sed、cut、tr、およびexpr、スクリプトが第二に実行します以下(Cでの私の経験に基づきます)。 これらのユーティリティをビルドすると、シェルスクリプトのソリューションのパフォーマンスが許容範囲内であるかどうかが異なる場合が多いようです。 明らかに、これらのユーティリティをビルトインしないことを選択した理由があります。システムレベルで1つのバージョンのユーティリティを使用すると、そのユーティリティの複数の異なるバージョンがさまざまなシェルで使用されることがなくなります。私は本当に多くの新しいプロセスを作成するオーバーヘッドを維持するために他の多くの理由を考えることはできません。準拠しています。少なくとも非常に多くのプロセスを持つことの非効率性ほど大きな問題ではありません。

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