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

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


13
ディレクトリ内のファイル数を数える最もリソース効率の良い方法は何ですか?
CentOS 5.9 先日、ディレクトリに多くのファイルがある問題に遭遇しました。それを数えるために、私は走ったls -l /foo/foo2/ | wc -l 1つのディレクトリに100万を超えるファイルがあったことがわかります(長い話-根本的な原因は修正されつつあります)。 私の質問は次のとおりです。カウントを行うより速い方法はありますか?カウントを取得する最も効率的な方法は何でしょうか?
55 bash  shell  directory  ls 

5
現在の日付を変数からファイル名に追加する
私はこのようなファイル名の最後に現在の日付を追加しようとしています: TheFile.log.2012-02-11 ここに私がこれまでに持っているものがあります: set today = 'date +%Y' mkdir -p The_Logs & find . -name The_Logs -atime -1 -type d -exec mv \{} "The_Logs_+$today" \; & ただし、ファイルの名前のみが取得され、何も追加されません。現在の日付をファイル名に追加するにはどうすればよいですか?
55 bash  shell  rename  date 

10
2つのリモート間でファイルをrsyncする方法は?
ローカルシェルを使用して2つのリモートホスト間でファイルを転送したいのですが、2つのリモートが次のように指定されている場合、rsyncは同期をサポートしていないようです: $ rsync -vuar host1:/var/www host2:/var/www The source and destination cannot both be remote. 同様の結果を得るために使用できる他の回避策/コマンドは何ですか?
54 shell  ssh  rsync 


8
「rm」をゴミ箱に移動する
ファイルを削除する代わりに、特別な「ゴミ箱」の場所に移動するLinuxスクリプト/アプリケーションはありますか?私はこれを代わりにしたいと思いますrm(後者をエイリアスすることさえあります。賛否両論があります)。 「ゴミ箱」とは、特別なフォルダを意味します。シングルmv $* ~/.trashは最初のステップですが、理想的には、古いゴミ箱に上書きせずに同じ名前の複数のファイルをゴミ箱に入れ、単純なコマンド(元に戻す)で元の場所にファイルを復元できます。さらに、再起動時にゴミ箱が自動的に空になった場合(または、無限の成長を防ぐための同様のメカニズム)に便利です。 これに対する部分的な解決策は存在しますが、特に「復元」アクションは簡単ではありません。グラフィカルシェルのゴミ箱システムに依存しない既存のソリューションはありますか? (余談ですが、頻繁なバックアップとVCSを使用するのではなく、このアプローチが正当であるかどうかについては議論が続いています。これらの議論には重要な点がありますが、私の要望にはまだニッチがあると思います。)
54 shell  rm 

2
「tail -f」に相当する「less」コマンドライン
lessを使用してファイルを開き、に類似したファイルを自動的にスクロールさせたいと思いますtail -f。 私は自分ができることを知ってless fileおり、それからShift-F永遠に前進するために叩きます。のようなtail -f。 私の入力がカラフルであるために必要なフラグをless提供するために必要--raw-control-charsです。
54 shell  less  tail 

3
シェルスクリプトで環境変数を「エクスポート」する方法を教えてください。
複数のAmazon EC2アカウントがあり$EC2_HOME、スクリプトを使用してなどの変数をすばやく切り替えることができるようにしたいと考えています。 次のように設定されたシェルスクリプトがあります。 #!/bin/sh export EC2_HOME=/home/me/.ec2 echo $EC2_HOME スクリプトを実行すると、EC2_HOME設定されていることがわかりexportますが、スクリプトの完了後に変数を使用すると変数が固定されると考えました。実行echo $EC_HOMEしても何も表示されないため、表示されません。 これは非常に初歩的なLinuxスクリプティングの知識でなければならないことは知っていますが、知りません。私は運のない関連する質問を探してみた-これが重複している場合、私の謝罪。

4
チルダ(〜)が二重引用符内で展開しないのはなぜですか?
この答えと私自身の理解によると、チルダはホームディレクトリに展開されます。 $ echo ~ /home/braiam さて、シェル拡張を機能させたいとき、つまり、などの変数名を使用し$FOO、予期しない文字、スペースなどを壊さないようにするには、二重引用符を使用する必要があります"。 $ FOO="some string with spaces" $ BAR="echo $FOO" $ echo $BAR echo some string with spaces この展開がチルダで機能しないのはなぜですか? $ echo ~/some/path /home/braiam/some/path $ echo "~/some/path" ~/some/path
54 shell 


4
Bash star *ワイルドカードは常に(昇順の)ソートされたリストを生成しますか?
私は、logXXXXが次のような2文字のゼロ詰めされた大文字の16進数であるような名前のファイルで満たされたディレクトリを持っています: log00 log01 log02 ... log0A log0B log0C ... log4E log4F log50 ... 一般に、合計で20または30個未満のファイルがあります。特定のシステムの日付と時刻は信頼できるものではありません(信頼できるNTPまたはGPS時刻ソースのない組み込みシステム)。ただし、上記のようにファイル名は確実に増加します。 私がしたいgrep、私は期待していた特定のタイプの単一の最新のログエントリのすべてのファイルを介しcatなど一緒にファイル... cat /tmp/logs/log* | grep 'WARNING 07 -' | tail -n1 しかし、bashor shまたはor zshなどの異なるバージョンが、どのように*展開されるかについて異なるアイデアを持っているかもしれないということが私には思いつきました。 このman bashページは、の拡張*が一致するファイル名のアルファベット順の完全に昇順のリストであるかどうかを示していません。利用可能なすべてのシステムで試してみるたびに上昇しているように見えますが、動作は定義済みですか、それとも実装固有ですか? 言い換えればcat /tmp/logs/log*、すべてのログファイルをアルファベット順に連結することに絶対に頼ることができますか?
53 bash  shell  wildcards 

6
/ bin / bashではなく/ bin / shを指すシェバンを持つ理由はありますか?
私が見たほとんどのシェルスクリプト(自分で書いていないスクリプトを除く)で、シバンがに設定されていることに気付きました#!/bin/sh。これは古いスクリプトでは本当に驚かないが、かなり新しいスクリプトでもそうだ。 好むための何らかの理由がある/bin/sh以上は、/bin/bash以来、bash十年以上前にうまくいって、多くのLinuxやBSDマシン上で、かなり多くの遍在し、多くの場合、デフォルト?
53 bash  shell  history  shebang 

1
「rm。*」は親ディレクトリを削除しますか?
式.*はbashによって展開され、現在のディレクトリと親ディレクトリが含まれます。 $ ls -la total 2600 drwxrwxrwx 2 terdon terdon 2162688 Sep 10 16:22 . drwxr-xr-x 142 terdon terdon 491520 Sep 10 15:34 .. -rw-r--r-- 1 terdon terdon 0 Sep 10 16:22 foo $ echo .* . .. rm -rf .*GNU bashを使用してDebianで実行している場合version 4.2.36(1)-release、rmからrm (GNU coreutils) 8.13このメッセージが表示されます。 $ rm -rf .* …
53 shell  wildcards  rm  posix 

7
シェルスクリプトでのタイムアウト
私が持っているシェルスクリプトだ標準入力からの読み込みを。まれに、入力の準備ができている人がいないため、スクリプトがタイムアウトする必要があります。タイムアウトの場合、スクリプトは何らかのクリーンアップコードを実行する必要があります。それを行う最良の方法は何ですか? このスクリプトは、Cコンパイラを使用しない20世紀のUNIXシステムやbusyboxを実行する組み込みデバイスなど、非常に移植性が高い必要があります。そのため、Perl、bash、コンパイル済み言語、およびPOSIX.2全体にさえ依存できません。特に、$PPID、read -t、完全にPOSIX準拠のトラップは使用できません。一時ファイルへの書き込みも除外されます。すべてのファイルシステムが読み取り専用でマウントされている場合でも、スクリプトが実行される場合があります。 物事をさらに難しくするために、タイムアウトにならないときにスクリプトを適度に高速にすることも必要です。特に、forkとexecが特に低いWindows(主にCygwin)でスクリプトを使用するため、使用を最小限に抑えたいと思います。 一言で言えば、私は持っています trap cleanup 1 2 3 15 foo=`cat` タイムアウトを追加したいです。私は置き換えることはできませんcatでread内蔵しています。タイムアウトの場合、cleanup関数を実行したいです。 背景:このスクリプトは、いくつかの8ビット文字を出力し、前後のカーソル位置を比較することにより、端末のエンコーディングを推測しています。スクリプトの最初は、stdoutがサポートされている端末に接続されていることをテストしますが、環境が嘘をついている場合があります(たとえば、で呼び出されてもplink設定されますTERM=xtermTERM=dumb)。スクリプトの関連部分は次のようになります。 text='Éé' # UTF-8; shows up as Ãé on a latin1 terminal csi='␛['; dsr_cpr="${csi}6n"; dsr_ok="${csi}5n" # ␛ is an escape character stty_save=`stty -g` cleanup () { stty "$stty_save"; } trap 'cleanup; exit 120' 0 1 2 3 …
53 shell  signals  timeout 

2
特定の変数のみをenvsubstで置き換える
を通じて環境変数の置換を実行しようとしていますenvsubstが、特定の変数のみを置換したいです。 ドキュメントから、envsubst特定の変数のみを置き換えるように伝えることができるはずですが、それを行うことができません。 たとえば、次を含むファイルがある場合: VAR_1=${VAR_1} VAR_2=${VAR_2} envsubstへの参照のみを置き換えるように実行するにはどうすればよい${VAR_1}ですか?

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