/bin
という名前のram
という名前の新しいテキストファイルを作成しました。
watch -n 1 free -h
ファイルsen
:
watch -n 1 sensors
入力を避けるために、同じフォルダに
watch blahblahblah...
毎回。
また、これら2つの権限を
-rw-r--r--
に
-rw-r--r-x
そして私の目標を達成しました。シェルを再度開いた後でも動作しました。つまり、watch -n 1 free -h
の代わりにram
と入力できました
しかし、同じ手順を試した後に問題が発生しました
cd /home/myname/Downloads/
/bin
に保存され、dow
という名前の新しいテキストファイル。権限も同じです。
今回はdow
はメッセージを表示しなくても、ターミナルでは何もしません。
同じファイルを/usr/bin
に保存しようとしましたが、端末は何もせず、作業ディレクトリは変更されません。
これはどのように可能ですか?
スクリプトを作成しましたが、動作します。スクリプトは、それを呼び出すシェルとは別のシェルで実行されるため、目的の処理を実行しません。
スクリプトが実行されるシェルは、スクリプトが指示したとおりに動作します。作業ディレクトリを~/Downloads
に変更します。他に何もすることがないので、終了します。呼び出し元のシェルのディレクトリは変更されていません。
あなたは私の言葉を受け取る必要はありません-ls
ファイルの次の行にdow
を追加することでそれを実証できます。コマンドを実行すると、~/Downloads
ディレクトリの内容が一覧表示されます(通常の色は、~/.bashrc
のエイリアスによって提供され、非対話型シェルでは提供されません)読まない)。
現在のシェルでスクリプトを実行するには、source
コマンドを使用できます。このコマンドは、. file
とも記述できます。だから、あなたが入力した場合
. dow
現在のシェルはディレクトリを変更します。
または、代わりにエイリアスを設定できます:
zanna@toaster:~$ alias dow='cd $HOME/Downloads'
zanna@toaster:~$ dow
zanna@toaster:~/Downloads$
永続的にするには、次の行を追加します
alias dow='cd $HOME/Downloads'
~/.bashrc
ファイルに。これにより、インタラクティブシェルを実行するたびに使用できるようになります。
これはクロスサイトの複製です: https://stackoverflow.com/a/255415/383694 。
問題は、スクリプトがサブシェルで実行されることです。スクリプトはディレクトリを変更してから閉じ、現在のシェルに変更を加えません。
2つの緩和策:
. dow
を実行して、現在のシェルのコンテキストでスクリプトを実行します。alias dow="cd /home/myname/Downloads/"
など。ディレクトリを変更する場合は、通常、他のことを行う前に動作することをテストすることをお勧めします。
リンクされた質問には他のいくつかのオプションがあります。